<?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%90%D1%80%D1%82%D0%B5%D0%BC+%D0%A2%D0%B0%D1%80%D0%B0%D0%BD</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%90%D1%80%D1%82%D0%B5%D0%BC+%D0%A2%D0%B0%D1%80%D0%B0%D0%BD"/>
	<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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD"/>
	<updated>2026-10-22T23:02:08Z</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=17797</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=17797"/>
		<updated>2016-11-16T19:38:44Z</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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + mlog(m) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]] (разделы 1.1 - 1.10, 2.7), [[Участник:ShimchikN|Шимчик Никита Владимирович]] (разделы 1.1 - 1.10, 2.7).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON&amp;lt;ref name=&amp;quot;rt&amp;quot;&amp;gt;http://www-users.cs.umn.edu/~han/dmclass/chameleon.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;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|1000px|thumb|center|Графы k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4) граф по принципу 3-х ближайших соседей&amp;lt;ref name=&amp;quot;rt&amp;quot;&amp;gt;http://www-users.cs.umn.edu/~han/dmclass/chameleon.pdf&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;; натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, используемое в качестве параметра алгоритма поиска k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа&amp;lt;ref name=&amp;quot;rty&amp;quot;&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;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbours[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbours, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
  [[File:Chameleon_inforgraph.png|811px]]&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;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе можно распараллелить процесс расчёта метрик сходства между кластерами, однако итоговое слияние всё равно должно выполняться последовательно.&lt;br /&gt;
Поскольку процесс сравнения кластеров возможно распараллелить, сложность 3-го этапа составляет &amp;lt;math&amp;gt;mlog(m) + m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + mlog(m) + m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
У второго и третьего этапов алгоритма сложно полностью оценить ресурсы параллелизма. Но оба этапа возможно частично распараллелить.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычислительную мощность&#039;&#039;&#039; для разных этапов алгоритма можно оценить как:&lt;br /&gt;
&lt;br /&gt;
1 этап: &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 этап: &amp;lt;math&amp;gt;O(\frac{nm}{n^2+m^2})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3 этап: &amp;lt;math&amp;gt;O(\frac{m^2log(m)}{m^2+n})&amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;b&amp;gt;Детерминированность:&amp;lt;/b&amp;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;
Проводилось исследование масштабируемости экспериментальной версии параллельной реализации алгоритма для малого числа потоков&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;
Однако можно заметить, что с увеличением числа потоков эффективность алгоритма падает.&lt;br /&gt;
&lt;br /&gt;
  [[File:Plot cham.jpg|850px|center]]&lt;br /&gt;
 &lt;br /&gt;
 [[File:Cham_speedup.png]] [[File:Cham_eff.png]]&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 name=&amp;quot;tra&amp;quot;&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS &amp;lt;ref name=&amp;quot;tru&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&amp;lt;/ref&amp;gt; , hMETIS &amp;lt;ref name=&amp;quot;tri&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref name=&amp;quot;tro&amp;quot;&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &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;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Артем Таран</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=17793</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=17793"/>
		<updated>2016-11-16T19:33:06Z</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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + mlog(m) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]] (разделы 1.1 - 1.10, 2.7), [[Участник:ShimchikN|Шимчик Никита Владимирович]] (разделы 1.1 - 1.10, 2.7).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON&amp;lt;ref name=&amp;quot;rt&amp;quot;&amp;gt;http://www-users.cs.umn.edu/~han/dmclass/chameleon.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;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|1000px|thumb|center|Графы k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4) граф по принципу 3-х ближайших соседей&amp;lt;ref name=&amp;quot;rt&amp;quot;&amp;gt;http://www-users.cs.umn.edu/~han/dmclass/chameleon.pdf&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;; натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, используемое в качестве параметра алгоритма поиска k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа&amp;lt;ref name=&amp;quot;rty&amp;quot;&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;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbours[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbours, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
  [[File:Chameleon_inforgraph.png|811px]]&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;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе можно распараллелить процесс расчёта метрик сходства между кластерами, однако итоговое слияние всё равно должно выполняться последовательно.&lt;br /&gt;
Поскольку процесс сравнения кластеров возможно распараллелить, сложность 3-го этапа составляет &amp;lt;math&amp;gt;mlog(m) + m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + mlog(m) + m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
У второго и третьего этапов алгоритма сложно полностью оценить ресурсы параллелизма. Но оба этапа возможно частично распараллелить.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычислительную мощность&#039;&#039;&#039; для разных этапов алгоритма можно оценить как:&lt;br /&gt;
&lt;br /&gt;
1 этап: &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 этап: &amp;lt;math&amp;gt;O(\frac{nm}{n^2+m^2})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3 этап: &amp;lt;math&amp;gt;O(\frac{m^2log(m)}{m^2+n})&amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;b&amp;gt;Детерминированность:&amp;lt;/b&amp;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;
Проводилось исследование масштабируемости экспериментальной версии параллельной реализации алгоритма для малого числа потоков&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;
Однако можно заметить, что с увеличением числа потоков эффективность алгоритма падает.&lt;br /&gt;
&lt;br /&gt;
  [[File:Plot cham.jpg]]&lt;br /&gt;
&lt;br /&gt;
  [[File:Cham_speedup.png]]&lt;br /&gt;
&lt;br /&gt;
  [[File:Cham_eff.png]]&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 name=&amp;quot;tra&amp;quot;&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS &amp;lt;ref name=&amp;quot;tru&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&amp;lt;/ref&amp;gt; , hMETIS &amp;lt;ref name=&amp;quot;tri&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref name=&amp;quot;tro&amp;quot;&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &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;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Артем Таран</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=17791</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=17791"/>
		<updated>2016-11-16T19:31: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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + mlog(m) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]] (разделы 1.1 - 1.10, 2.7), [[Участник:ShimchikN|Шимчик Никита Владимирович]] (разделы 1.1 - 1.10, 2.7).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON&amp;lt;ref name=&amp;quot;rt&amp;quot;&amp;gt;http://www-users.cs.umn.edu/~han/dmclass/chameleon.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;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|1000px|thumb|center|Графы k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4) граф по принципу 3-х ближайших соседей&amp;lt;ref name=&amp;quot;rt&amp;quot;&amp;gt;http://www-users.cs.umn.edu/~han/dmclass/chameleon.pdf&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;; натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, используемое в качестве параметра алгоритма поиска k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа&amp;lt;ref name=&amp;quot;rty&amp;quot;&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;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbours[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbours, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
  [[File:Chameleon_inforgraph.png|811px]]&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;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе можно распараллелить процесс расчёта метрик сходства между кластерами, однако итоговое слияние всё равно должно выполняться последовательно.&lt;br /&gt;
Поскольку процесс сравнения кластеров возможно распараллелить, сложность 3-го этапа составляет &amp;lt;math&amp;gt;mlog(m) + m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + mlog(m) + m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
У второго и третьего этапов алгоритма сложно полностью оценить ресурсы параллелизма. Но оба этапа возможно частично распараллелить.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычислительную мощность&#039;&#039;&#039; для разных этапов алгоритма можно оценить как:&lt;br /&gt;
&lt;br /&gt;
1 этап: &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 этап: &amp;lt;math&amp;gt;O(\frac{nm}{n^2+m^2})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3 этап: &amp;lt;math&amp;gt;O(\frac{m^2log(m)}{m^2+n})&amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;b&amp;gt;Детерминированность:&amp;lt;/b&amp;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;
Проводилось исследование масштабируемости экспериментальной версии параллельной реализации алгоритма для малого числа потоков&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;
Однако, можно заметить, что с увеличением числа потоков эффективность алгоритма падает.&lt;br /&gt;
&lt;br /&gt;
  [[File:Plot cham.jpg]]&lt;br /&gt;
&lt;br /&gt;
  [[File:Cham_speedup.png]]&lt;br /&gt;
&lt;br /&gt;
  [[File:Cham_eff.png]]&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 name=&amp;quot;tra&amp;quot;&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS &amp;lt;ref name=&amp;quot;tru&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&amp;lt;/ref&amp;gt; , hMETIS &amp;lt;ref name=&amp;quot;tri&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref name=&amp;quot;tro&amp;quot;&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &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;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Артем Таран</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=17790</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=17790"/>
		<updated>2016-11-16T19:29:57Z</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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + mlog(m) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]] (разделы 1.1 - 1.10, 2.7), [[Участник:ShimchikN|Шимчик Никита Владимирович]] (разделы 1.1 - 1.10, 2.7).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON&amp;lt;ref name=&amp;quot;rt&amp;quot;&amp;gt;http://www-users.cs.umn.edu/~han/dmclass/chameleon.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;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|1000px|thumb|center|Графы k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4) граф по принципу 3-х ближайших соседей&amp;lt;ref name=&amp;quot;rt&amp;quot;&amp;gt;http://www-users.cs.umn.edu/~han/dmclass/chameleon.pdf&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;; натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, используемое в качестве параметра алгоритма поиска k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа&amp;lt;ref name=&amp;quot;rty&amp;quot;&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;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbours[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbours, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
  [[File:Chameleon_inforgraph.png|811px]]&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;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе можно распараллелить процесс расчёта метрик сходства между кластерами, однако итоговое слияние всё равно должно выполняться последовательно.&lt;br /&gt;
Поскольку процесс сравнения кластеров возможно распараллелить, сложность 3-го этапа составляет &amp;lt;math&amp;gt;mlog(m) + m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + mlog(m) + m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
У второго и третьего этапов алгоритма сложно полностью оценить ресурсы параллелизма. Но оба этапа возможно частично распараллелить.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычислительную мощность&#039;&#039;&#039; для разных этапов алгоритма можно оценить как:&lt;br /&gt;
&lt;br /&gt;
1 этап: &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 этап: &amp;lt;math&amp;gt;O(\frac{nm}{n^2+m^2})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3 этап: &amp;lt;math&amp;gt;O(\frac{m^2log(m)}{m^2+n})&amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;b&amp;gt;Детерминированность:&amp;lt;/b&amp;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;
Проводилось исследование масштабируемости экспериментальной версии параллельной реализации алгоритма для малого числа потоков&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;
  [[File:Plot cham.jpg]]&lt;br /&gt;
&lt;br /&gt;
  [[File:Cham_speedup.png]]&lt;br /&gt;
&lt;br /&gt;
  [[File:Cham_eff.png]]&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 name=&amp;quot;tra&amp;quot;&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS &amp;lt;ref name=&amp;quot;tru&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&amp;lt;/ref&amp;gt; , hMETIS &amp;lt;ref name=&amp;quot;tri&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref name=&amp;quot;tro&amp;quot;&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &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;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Артем Таран</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=17789</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=17789"/>
		<updated>2016-11-16T19:29: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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + mlog(m) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]] (разделы 1.1 - 1.10, 2.7), [[Участник:ShimchikN|Шимчик Никита Владимирович]] (разделы 1.1 - 1.10, 2.7).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON&amp;lt;ref name=&amp;quot;rt&amp;quot;&amp;gt;http://www-users.cs.umn.edu/~han/dmclass/chameleon.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;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|1000px|thumb|center|Графы k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4) граф по принципу 3-х ближайших соседей&amp;lt;ref name=&amp;quot;rt&amp;quot;&amp;gt;http://www-users.cs.umn.edu/~han/dmclass/chameleon.pdf&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;; натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, используемое в качестве параметра алгоритма поиска k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа&amp;lt;ref name=&amp;quot;rty&amp;quot;&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;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbours[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbours, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
  [[File:Chameleon_inforgraph.png|811px]]&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;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе можно распараллелить процесс расчёта метрик сходства между кластерами, однако итоговое слияние всё равно должно выполняться последовательно.&lt;br /&gt;
Поскольку процесс сравнения кластеров возможно распараллелить, сложность 3-го этапа составляет &amp;lt;math&amp;gt;mlog(m) + m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + mlog(m) + m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
У второго и третьего этапов алгоритма сложно полностью оценить ресурсы параллелизма. Но оба этапа возможно частично распараллелить.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычислительную мощность&#039;&#039;&#039; для разных этапов алгоритма можно оценить как:&lt;br /&gt;
&lt;br /&gt;
1 этап: &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 этап: &amp;lt;math&amp;gt;O(\frac{nm}{n^2+m^2})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3 этап: &amp;lt;math&amp;gt;O(\frac{m^2log(m)}{m^2+n})&amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;b&amp;gt;Детерминированность:&amp;lt;/b&amp;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;
Проводилось исследование масштабируемости экспериментальной версии параллельной реализации алгоритма для малого числа потоков&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;
  [[File:Plot cham.jpg]]&lt;br /&gt;
&lt;br /&gt;
  [[File:Cham_speedup.png]]&lt;br /&gt;
&lt;br /&gt;
  [[File:Cham_eff.png]]&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 name=&amp;quot;tra&amp;quot;&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS &amp;lt;ref name=&amp;quot;tru&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&amp;lt;/ref&amp;gt; , hMETIS &amp;lt;ref name=&amp;quot;tri&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref name=&amp;quot;tro&amp;quot;&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &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;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Артем Таран</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=17788</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=17788"/>
		<updated>2016-11-16T19:29:30Z</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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + mlog(m) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]] (разделы 1.1 - 1.10, 2.7), [[Участник:ShimchikN|Шимчик Никита Владимирович]] (разделы 1.1 - 1.10, 2.7).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON&amp;lt;ref name=&amp;quot;rt&amp;quot;&amp;gt;http://www-users.cs.umn.edu/~han/dmclass/chameleon.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;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|1000px|thumb|center|Графы k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4) граф по принципу 3-х ближайших соседей&amp;lt;ref name=&amp;quot;rt&amp;quot;&amp;gt;http://www-users.cs.umn.edu/~han/dmclass/chameleon.pdf&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;; натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, используемое в качестве параметра алгоритма поиска k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа&amp;lt;ref name=&amp;quot;rty&amp;quot;&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;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbours[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbours, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
  [[File:Chameleon_inforgraph.png|811px]]&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;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе можно распараллелить процесс расчёта метрик сходства между кластерами, однако итоговое слияние всё равно должно выполняться последовательно.&lt;br /&gt;
Поскольку процесс сравнения кластеров возможно распараллелить, сложность 3-го этапа составляет &amp;lt;math&amp;gt;mlog(m) + m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + mlog(m) + m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
У второго и третьего этапов алгоритма сложно полностью оценить ресурсы параллелизма. Но оба этапа возможно частично распараллелить.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычислительную мощность&#039;&#039;&#039; для разных этапов алгоритма можно оценить как:&lt;br /&gt;
&lt;br /&gt;
1 этап: &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 этап: &amp;lt;math&amp;gt;O(\frac{nm}{n^2+m^2})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3 этап: &amp;lt;math&amp;gt;O(\frac{m^2log(m)}{m^2+n})&amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;b&amp;gt;Детерминированность:&amp;lt;/b&amp;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;
Проводилось исследование масштабируемости экспериментальной версии параллельной реализации алгоритма для малого числа потоков&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;
  [[File:Plot cham.jpg]]&lt;br /&gt;
&lt;br /&gt;
  [[File:Cham_speedup.png]]&lt;br /&gt;
&lt;br /&gt;
  [[File:Cham_eff.png]]&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 name=&amp;quot;tra&amp;quot;&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS &amp;lt;ref name=&amp;quot;tru&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&amp;lt;/ref&amp;gt; , hMETIS &amp;lt;ref name=&amp;quot;tri&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref name=&amp;quot;tro&amp;quot;&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &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;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Артем Таран</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=17787</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=17787"/>
		<updated>2016-11-16T19:24:28Z</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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + mlog(m) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]] (разделы 1.1 - 1.10, 2.7), [[Участник:ShimchikN|Шимчик Никита Владимирович]] (разделы 1.1 - 1.10, 2.7).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON&amp;lt;ref name=&amp;quot;rt&amp;quot;&amp;gt;http://www-users.cs.umn.edu/~han/dmclass/chameleon.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;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|1000px|thumb|center|Графы k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4) граф по принципу 3-х ближайших соседей&amp;lt;ref name=&amp;quot;rt&amp;quot;&amp;gt;http://www-users.cs.umn.edu/~han/dmclass/chameleon.pdf&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;; натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, используемое в качестве параметра алгоритма поиска k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа&amp;lt;ref name=&amp;quot;rty&amp;quot;&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;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbours[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbours, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
  [[File:Chameleon_inforgraph.png|811px]]&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;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе можно распараллелить процесс расчёта метрик сходства между кластерами, однако итоговое слияние всё равно должно выполняться последовательно.&lt;br /&gt;
Поскольку процесс сравнения кластеров возможно распараллелить, сложность 3-го этапа составляет &amp;lt;math&amp;gt;mlog(m) + m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + mlog(m) + m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
У второго и третьего этапов алгоритма сложно полностью оценить ресурсы параллелизма. Но оба этапа возможно частично распараллелить.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычислительную мощность&#039;&#039;&#039; для разных этапов алгоритма можно оценить как:&lt;br /&gt;
&lt;br /&gt;
1 этап: &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 этап: &amp;lt;math&amp;gt;O(\frac{nm}{n^2+m^2})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3 этап: &amp;lt;math&amp;gt;O(\frac{m^2log(m)}{m^2+n})&amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;b&amp;gt;Детерминированность:&amp;lt;/b&amp;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;
Проводилось исследование масштабируемости экспериментальной версии параллельной реализации алгоритма для малого числа потоков&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;
  [[File:Plot cham.jpg]]&lt;br /&gt;
&lt;br /&gt;
  [[File:Cham_speedup.png]]&lt;br /&gt;
&lt;br /&gt;
  [[File:Cham_eff.png]]&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 name=&amp;quot;tra&amp;quot;&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS &amp;lt;ref name=&amp;quot;tru&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&amp;lt;/ref&amp;gt; , hMETIS &amp;lt;ref name=&amp;quot;tri&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref name=&amp;quot;tro&amp;quot;&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &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;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Артем Таран</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=17786</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=17786"/>
		<updated>2016-11-16T19:23: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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + mlog(m) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]] (разделы 1.1 - 1.10, 2.7), [[Участник:ShimchikN|Шимчик Никита Владимирович]] (разделы 1.1 - 1.10, 2.7).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON&amp;lt;ref name=&amp;quot;rt&amp;quot;&amp;gt;http://www-users.cs.umn.edu/~han/dmclass/chameleon.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;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|1000px|thumb|center|Графы k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4) граф по принципу 3-х ближайших соседей&amp;lt;ref name=&amp;quot;rt&amp;quot;&amp;gt;http://www-users.cs.umn.edu/~han/dmclass/chameleon.pdf&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;; натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, используемое в качестве параметра алгоритма поиска k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа&amp;lt;ref name=&amp;quot;rty&amp;quot;&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;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbours[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbours, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
  [[File:Chameleon_inforgraph.png|811px]]&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;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе можно распараллелить процесс расчёта метрик сходства между кластерами, однако итоговое слияние всё равно должно выполняться последовательно.&lt;br /&gt;
Поскольку процесс сравнения кластеров возможно распараллелить, сложность 3-го этапа составляет &amp;lt;math&amp;gt;mlog(m) + m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + mlog(m) + m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
У второго и третьего этапов алгоритма сложно полностью оценить ресурсы параллелизма. Но оба этапа возможно частично распараллелить.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычислительную мощность&#039;&#039;&#039; для разных этапов алгоритма можно оценить как:&lt;br /&gt;
&lt;br /&gt;
1 этап: &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 этап: &amp;lt;math&amp;gt;O(\frac{nm}{n^2+m^2})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3 этап: &amp;lt;math&amp;gt;O(\frac{m^2log(m)}{m^2+n})&amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;b&amp;gt;Детерминированность:&amp;lt;/b&amp;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;
Проводилось исследование масштабируемости экспериментальной версии параллельной реализации алгоритма для малого числа потоков&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;
  [[File:Plot cham.jpg]&lt;br /&gt;
&lt;br /&gt;
  [[File:Cham_speedup.png]]&lt;br /&gt;
&lt;br /&gt;
  [[File:Cham_eff.png]]&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 name=&amp;quot;tra&amp;quot;&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS &amp;lt;ref name=&amp;quot;tru&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&amp;lt;/ref&amp;gt; , hMETIS &amp;lt;ref name=&amp;quot;tri&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref name=&amp;quot;tro&amp;quot;&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &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;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Артем Таран</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=17784</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=17784"/>
		<updated>2016-11-16T19:15:33Z</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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + mlog(m) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]] (разделы 1.1 - 1.10, 2.7), [[Участник:ShimchikN|Шимчик Никита Владимирович]] (разделы 1.1 - 1.10, 2.7).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON&amp;lt;ref name=&amp;quot;rt&amp;quot;&amp;gt;http://www-users.cs.umn.edu/~han/dmclass/chameleon.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;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|1000px|thumb|center|Графы k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4) граф по принципу 3-х ближайших соседей&amp;lt;ref name=&amp;quot;rt&amp;quot;&amp;gt;http://www-users.cs.umn.edu/~han/dmclass/chameleon.pdf&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;; натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, используемое в качестве параметра алгоритма поиска k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа&amp;lt;ref name=&amp;quot;rty&amp;quot;&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;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbours[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbours, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
  [[File:Chameleon_inforgraph.png|811px]]&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;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе можно распараллелить процесс расчёта метрик сходства между кластерами, однако итоговое слияние всё равно должно выполняться последовательно.&lt;br /&gt;
Поскольку процесс сравнения кластеров возможно распараллелить, сложность 3-го этапа составляет &amp;lt;math&amp;gt;mlog(m) + m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + mlog(m) + m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
У второго и третьего этапов алгоритма сложно полностью оценить ресурсы параллелизма. Но оба этапа возможно частично распараллелить.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычислительную мощность&#039;&#039;&#039; для разных этапов алгоритма можно оценить как:&lt;br /&gt;
&lt;br /&gt;
1 этап: &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 этап: &amp;lt;math&amp;gt;O(\frac{nm}{n^2+m^2})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3 этап: &amp;lt;math&amp;gt;O(\frac{m^2log(m)}{m^2+n})&amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;b&amp;gt;Детерминированность:&amp;lt;/b&amp;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;
  [[File:Plot cham.jpg]]&lt;br /&gt;
&lt;br /&gt;
  [[File:Cham_speedup.png]]&lt;br /&gt;
&lt;br /&gt;
  [[File:Cham_eff.png]]&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 name=&amp;quot;tra&amp;quot;&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS &amp;lt;ref name=&amp;quot;tru&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&amp;lt;/ref&amp;gt; , hMETIS &amp;lt;ref name=&amp;quot;tri&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref name=&amp;quot;tro&amp;quot;&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &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;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Артем Таран</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=14655</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=14655"/>
		<updated>2016-10-29T08:50:46Z</updated>

		<summary type="html">&lt;p&gt;Артем Таран: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Графо-ориентированный алгоритм кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + mlog(m) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]] (разделы 1.1 - 1.10, 2.7), [[Участник:ShimchikN|Шимчик Никита Владимирович]] (разделы 1.1 - 1.10, 2.7).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON&amp;lt;ref name=&amp;quot;rt&amp;quot;&amp;gt;http://www-users.cs.umn.edu/~han/dmclass/chameleon.pdf&amp;lt;/ref&amp;gt; - алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|1000px|thumb|center|Графы k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4) граф по принципу 3-х ближайших соседей&amp;lt;ref name=&amp;quot;rt&amp;quot;&amp;gt;http://www-users.cs.umn.edu/~han/dmclass/chameleon.pdf&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа&amp;lt;ref name=&amp;quot;rty&amp;quot;&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;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
  [[File:Chameleon_inforgraph.png|811px]]&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;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе можно распараллелить процесс расчёта метрик сходства между кластерами, однако итоговое слияние всё равно должно выполняться последовательно.&lt;br /&gt;
Поскольку процесс сравнения кластеров возможно распараллелить, сложность 3-го этапа составляет &amp;lt;math&amp;gt;mlog(m) + m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + mlog(m) + m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
У второго и третьего этапов алгоритма сложно полностью оценить ресурсы параллелизма. Но оба этапа возможно частично распараллелить.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычислительную мощность&#039;&#039;&#039; для разных этапов алгоритма можно оценить как:&lt;br /&gt;
&lt;br /&gt;
1 этап: &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 этап: &amp;lt;math&amp;gt;O(\frac{nm}{n^2+m^2})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3 этап: &amp;lt;math&amp;gt;O(\frac{m^2log(m)}{m^2+n})&amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;b&amp;gt;Детерминированность:&amp;lt;/b&amp;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;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует несколько последовательных реализаций алгоритма. С одной из них можно ознакомиться по ссылке &amp;lt;ref name=&amp;quot;tra&amp;quot;&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS &amp;lt;ref name=&amp;quot;tru&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&amp;lt;/ref&amp;gt; , hMETIS &amp;lt;ref name=&amp;quot;tri&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref name=&amp;quot;tro&amp;quot;&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &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;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Артем Таран</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=13790</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=13790"/>
		<updated>2016-10-25T16:37:15Z</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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + mlog(m) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]] (разделы 1.1 - 1.10, 2.7), [[Участник:ShimchikN|Шимчик Никита Владимирович]] (разделы 1.1 - 1.10, 2.7).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON&amp;lt;ref name=&amp;quot;rt&amp;quot;&amp;gt;http://www-users.cs.umn.edu/~han/dmclass/chameleon.pdf&amp;lt;/ref&amp;gt; - алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|1000px|thumb|center|Графы k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4) граф по принципу 3-х ближайших соседей&amp;lt;ref name=&amp;quot;rt&amp;quot;&amp;gt;http://www-users.cs.umn.edu/~han/dmclass/chameleon.pdf&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа&amp;lt;ref name=&amp;quot;rty&amp;quot;&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;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
  [[File:Chameleon_inforgraph.png|811px]]&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;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе можно распараллелить процесс расчёта метрик сходства между кластерами, однако итоговое слияние всё равно должно выполняться последовательно.&lt;br /&gt;
Поскольку процесс сравнения кластеров возможно распараллелить, сложность 3-го этапа составляет &amp;lt;math&amp;gt;mlog(m) + m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + mlog(m) + m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
У второго и третьего этапов алгоритма сложно полностью оценить ресурсы параллелизма. Но оба этапа возможно частично распараллелить. &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;b&amp;gt;Детерминированность:&amp;lt;/b&amp;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;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует несколько последовательных реализаций алгоритма. С одной из них можно ознакомиться по ссылке &amp;lt;ref name=&amp;quot;tra&amp;quot;&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS &amp;lt;ref name=&amp;quot;tru&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&amp;lt;/ref&amp;gt; , hMETIS &amp;lt;ref name=&amp;quot;tri&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref name=&amp;quot;tro&amp;quot;&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &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;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Артем Таран</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%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=11537</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=11537"/>
		<updated>2016-10-15T19:46:34Z</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;
}}&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 - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, Хамелеон использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&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; - разбиение множества V на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&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>
	<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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=10417</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=10417"/>
		<updated>2016-10-15T16:03:36Z</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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + mlog(m) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]] (разделы 1.1 - 1.10, 2.7), [[Участник:ShimchikN|Шимчик Никита Владимирович]] (разделы 1.1 - 1.10, 2.7).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON&amp;lt;ref name=&amp;quot;rt&amp;quot;&amp;gt;http://www-users.cs.umn.edu/~han/dmclass/chameleon.pdf&amp;lt;/ref&amp;gt; - алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|1000px|thumb|center|Графы k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4) граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа&amp;lt;ref name=&amp;quot;rty&amp;quot;&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;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
  [[File:Chameleon_inforgraph.png|811px]]&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;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе можно распараллелить процесс расчёта метрик сходства между кластерами, однако итоговое слияние всё равно должно выполняться последовательно.&lt;br /&gt;
Поскольку процесс сравнения кластеров возможно распараллелить, сложность 3-го этапа составляет &amp;lt;math&amp;gt;mlog(m) + m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + mlog(m) + m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
У второго и третьего этапов алгоритма сложно полностью оценить ресурсы параллелизма. Но оба этапа возможно частично распараллелить. &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;b&amp;gt;Детерминированность:&amp;lt;/b&amp;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;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует несколько последовательных реализаций алгоритма. С одной из них можно ознакомиться по ссылке &amp;lt;ref name=&amp;quot;tra&amp;quot;&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS &amp;lt;ref name=&amp;quot;tru&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&amp;lt;/ref&amp;gt; , hMETIS &amp;lt;ref name=&amp;quot;tri&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref name=&amp;quot;tro&amp;quot;&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &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;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Артем Таран</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=10304</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=10304"/>
		<updated>2016-10-15T15:47:15Z</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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + mlog(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]] (разделы 1.1 - 1.10, 2.7), [[Участник:ShimchikN|Шимчик Никита Владимирович]] (разделы 1.1 - 1.10, 2.7).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON&amp;lt;ref name=&amp;quot;rt&amp;quot;&amp;gt;http://www-users.cs.umn.edu/~han/dmclass/chameleon.pdf&amp;lt;/ref&amp;gt; - алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|1000px|thumb|center|Графы k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4) граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа&amp;lt;ref name=&amp;quot;rty&amp;quot;&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;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
  [[File:Chameleon_inforgraph.png|811px]]&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; ближайших соседей. Таким образом, его параллельная сложность составляет O(n).&lt;br /&gt;
&lt;br /&gt;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&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;, выделив для каждого &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; свой процесс. &lt;br /&gt;
Поскольку процесс сравнения кластеров возможно распараллелить сложность 3-го этапа составляет &amp;lt;math&amp;gt;mlog(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + mlog(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
У второго и третьего этапов алгоритма сложно полностью оценить ресурсы параллелизма. Но оба этапа возможно частично распараллелить. &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;b&amp;gt;Детерминированность:&amp;lt;/b&amp;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;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует несколько последовательных реализаций алгоритма. С одной из них можно ознакомиться по ссылке &amp;lt;ref name=&amp;quot;tra&amp;quot;&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS &amp;lt;ref name=&amp;quot;tru&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&amp;lt;/ref&amp;gt; , hMETIS &amp;lt;ref name=&amp;quot;tri&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref name=&amp;quot;tro&amp;quot;&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &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;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Артем Таран</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=10297</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=10297"/>
		<updated>2016-10-15T15:45:48Z</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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]] (разделы 1.1 - 1.10, 2.7), [[Участник:ShimchikN|Шимчик Никита Владимирович]] (разделы 1.1 - 1.10, 2.7).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON&amp;lt;ref name=&amp;quot;rt&amp;quot;&amp;gt;http://www-users.cs.umn.edu/~han/dmclass/chameleon.pdf&amp;lt;/ref&amp;gt; - алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|1000px|thumb|center|Графы k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4) граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа&amp;lt;ref name=&amp;quot;rty&amp;quot;&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;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
  [[File:Chameleon_inforgraph.png|811px]]&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; ближайших соседей. Таким образом, его параллельная сложность составляет O(n).&lt;br /&gt;
&lt;br /&gt;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&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;, выделив для каждого &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; свой процесс. &lt;br /&gt;
Поскольку процесс сравнения кластеров возможно распараллелить сложность 3-го этапа составляет &amp;lt;math&amp;gt;mlog(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + mlog(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
У второго и третьего этапов алгоритма сложно полностью оценить ресурсы параллелизма. Но оба этапа возможно частично распараллелить. &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;b&amp;gt;Детерминированность:&amp;lt;/b&amp;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;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует несколько последовательных реализаций алгоритма. С одной из них можно ознакомиться по ссылке &amp;lt;ref name=&amp;quot;tra&amp;quot;&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS &amp;lt;ref name=&amp;quot;tru&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&amp;lt;/ref&amp;gt; , hMETIS &amp;lt;ref name=&amp;quot;tri&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref name=&amp;quot;tro&amp;quot;&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &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;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Артем Таран</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=10294</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=10294"/>
		<updated>2016-10-15T15:44:58Z</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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]] (разделы 1.1 - 1.10, 2.7), [[Участник:ShimchikN|Шимчик Никита Владимирович]] (разделы 1.1 - 1.10, 2.7).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON&amp;lt;ref name=&amp;quot;rt&amp;quot;&amp;gt;http://www-users.cs.umn.edu/~han/dmclass/chameleon.pdf&amp;lt;/ref&amp;gt; - алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|1000px|thumb|center|Графы k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4) граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа&amp;lt;ref name=&amp;quot;rty&amp;quot;&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;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
  [[File:Chameleon_inforgraph.png|811px]]&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; ближайших соседей. Таким образом, его параллельная сложность составляет O(n).&lt;br /&gt;
&lt;br /&gt;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&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;, выделив для каждого &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; свой процесс. &lt;br /&gt;
Поскольку процесс сравнения кластеров возможно распараллелить сложность 3-го этапа составляет &amp;lt;math&amp;gt;mlog(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + mlog(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
У второго и третьего этапов алгоритма сложно полностью оценить ресурсы параллелизма. Второй этап возможно частично распараллелить, в том время третий этап в основном является последовательным. &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;b&amp;gt;Детерминированность:&amp;lt;/b&amp;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;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует несколько последовательных реализаций алгоритма. С одной из них можно ознакомиться по ссылке &amp;lt;ref name=&amp;quot;tra&amp;quot;&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS &amp;lt;ref name=&amp;quot;tru&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&amp;lt;/ref&amp;gt; , hMETIS &amp;lt;ref name=&amp;quot;tri&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref name=&amp;quot;tro&amp;quot;&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &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;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Артем Таран</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=10293</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=10293"/>
		<updated>2016-10-15T15:44: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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]] (разделы 1.1 - 1.10, 2.7), [[Участник:ShimchikN|Шимчик Никита Владимирович]] (разделы 1.1 - 1.10, 2.7).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON&amp;lt;ref name=&amp;quot;rt&amp;quot;&amp;gt;http://www-users.cs.umn.edu/~han/dmclass/chameleon.pdf&amp;lt;/ref&amp;gt; - алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|1000px|thumb|center|Графы k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4) граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа&amp;lt;ref name=&amp;quot;rty&amp;quot;&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;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
  [[File:Chameleon_inforgraph.png|811px]]&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; ближайших соседей. Таким образом, его параллельная сложность составляет O(n).&lt;br /&gt;
&lt;br /&gt;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&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;, выделив для каждого &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; свой процесс. &lt;br /&gt;
Поскольку процесс сравнения кластеров возможно распараллелить сложность 3-го этапа составляет &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + mlog(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
У второго и третьего этапов алгоритма сложно полностью оценить ресурсы параллелизма. Второй этап возможно частично распараллелить, в том время третий этап в основном является последовательным. &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;b&amp;gt;Детерминированность:&amp;lt;/b&amp;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;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует несколько последовательных реализаций алгоритма. С одной из них можно ознакомиться по ссылке &amp;lt;ref name=&amp;quot;tra&amp;quot;&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS &amp;lt;ref name=&amp;quot;tru&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&amp;lt;/ref&amp;gt; , hMETIS &amp;lt;ref name=&amp;quot;tri&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref name=&amp;quot;tro&amp;quot;&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &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;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Артем Таран</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=10287</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=10287"/>
		<updated>2016-10-15T15:43: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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]] (разделы 1.1 - 1.10, 2.7), [[Участник:ShimchikN|Шимчик Никита Владимирович]] (разделы 1.1 - 1.10, 2.7).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON&amp;lt;ref name=&amp;quot;rt&amp;quot;&amp;gt;http://www-users.cs.umn.edu/~han/dmclass/chameleon.pdf&amp;lt;/ref&amp;gt; - алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|1000px|thumb|center|Графы k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4) граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа&amp;lt;ref name=&amp;quot;rty&amp;quot;&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;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
  [[File:Chameleon_inforgraph.png|811px]]&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; ближайших соседей. Таким образом, его параллельная сложность составляет O(n).&lt;br /&gt;
&lt;br /&gt;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&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;, выделив для каждого &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; свой процесс. &lt;br /&gt;
Поскольку процесс сравнения кластеров возможно распараллелить сложность 3-го этапа составляет &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
У второго и третьего этапов алгоритма сложно полностью оценить ресурсы параллелизма. Второй этап возможно частично распараллелить, в том время третий этап в основном является последовательным. &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;b&amp;gt;Детерминированность:&amp;lt;/b&amp;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;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует несколько последовательных реализаций алгоритма. С одной из них можно ознакомиться по ссылке &amp;lt;ref name=&amp;quot;tra&amp;quot;&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS &amp;lt;ref name=&amp;quot;tru&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&amp;lt;/ref&amp;gt; , hMETIS &amp;lt;ref name=&amp;quot;tri&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref name=&amp;quot;tro&amp;quot;&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &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;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Артем Таран</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9776</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9776"/>
		<updated>2016-10-15T13:50:03Z</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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]] (разделы 1.1 - 1.10, 2.7), [[Участник:ShimchikN|Шимчик Никита Владимирович]] (разделы 1.1 - 1.10, 2.7).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON&amp;lt;ref name=&amp;quot;rt&amp;quot;&amp;gt;http://www-users.cs.umn.edu/~han/dmclass/chameleon.pdf&amp;lt;/ref&amp;gt; - алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|1000px|thumb|center|Графы k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4) граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа&amp;lt;ref name=&amp;quot;rty&amp;quot;&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;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
  [[File:Chameleon_inforgraph.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; ближайших соседей. Таким образом, его параллельная сложность составляет O(n).&lt;br /&gt;
&lt;br /&gt;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап распараллелить не представляется возможным, поскольку выбор очередной пары кластеров для сравнения зависит от результата выполнения предыдущей итерации, поэтому сложность оставляется равной &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
У второго и третьего этапов алгоритма сложно полностью оценить ресурсы параллелизма. Второй этап возможно частично распараллелить, в том время третий этап в основном является последовательным. &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;b&amp;gt;Детерминированность:&amp;lt;/b&amp;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;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует несколько последовательных реализаций алгоритма. С одной из них можно ознакомиться по ссылке &amp;lt;ref name=&amp;quot;tra&amp;quot;&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS &amp;lt;ref name=&amp;quot;tru&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&amp;lt;/ref&amp;gt; , hMETIS &amp;lt;ref name=&amp;quot;tri&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref name=&amp;quot;tro&amp;quot;&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &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;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Артем Таран</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9774</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9774"/>
		<updated>2016-10-15T13:49: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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]] (разделы 1.1 - 1.10, 2.7), [[Участник:ShimchikN|Шимчик Никита Владимирович]] (разделы 1.1 - 1.10, 2.7).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON&amp;lt;ref name=&amp;quot;rt&amp;quot;&amp;gt;http://www-users.cs.umn.edu/~han/dmclass/chameleon.pdf&amp;lt;/ref&amp;gt; - алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|1000px|thumb|center|Графы k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4) граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа&amp;lt;ref name=&amp;quot;rty&amp;quot;&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;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
  [[File:Chameleon_inforgraph.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; ближайших соседей. Таким образом, его параллельная сложность составляет O(n).&lt;br /&gt;
&lt;br /&gt;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап распараллелить не представляется возможным, поскольку выбор очередной пары кластеров для сравнения зависит от результата выполнения предыдущей итерации, поэтому сложность оставляется равной &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
У второго и третьего этапов алгоритма сложно полностью оценить ресурсы параллелизма. Второй этап возможно частично распараллелить, в том время третий этап в основном является последовательным. &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;b&amp;gt;Детерминированность:&amp;lt;/b&amp;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;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует несколько последовательных реализаций алгоритма. С одной из них можно ознакомиться по ссылке &amp;lt;ref name=&amp;quot;tra&amp;quot;&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS &amp;lt;ref name=&amp;quot;tru&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&amp;lt;/ref&amp;gt; , hMETIS &amp;lt;ref name=&amp;quot;tri&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref name=&amp;quot;tro&amp;quot;&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &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;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Артем Таран</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9772</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9772"/>
		<updated>2016-10-15T13:48:36Z</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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]] (разделы 1.1 - 1.10, 2.7), [[Участник:ShimchikN|Шимчик Никита Владимирович]] (разделы 1.1 - 1.10, 2.7).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON&amp;lt;ref name=&amp;quot;rt&amp;quot;&amp;gt;http://www-users.cs.umn.edu/~han/dmclass/chameleon.pdf&amp;lt;/ref&amp;gt; - алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|1000px|thumb|right|Графы k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4) граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа&amp;lt;ref name=&amp;quot;rty&amp;quot;&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;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
  [[File:Chameleon_inforgraph.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; ближайших соседей. Таким образом, его параллельная сложность составляет O(n).&lt;br /&gt;
&lt;br /&gt;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап распараллелить не представляется возможным, поскольку выбор очередной пары кластеров для сравнения зависит от результата выполнения предыдущей итерации, поэтому сложность оставляется равной &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
У второго и третьего этапов алгоритма сложно полностью оценить ресурсы параллелизма. Второй этап возможно частично распараллелить, в том время третий этап в основном является последовательным. &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;b&amp;gt;Детерминированность:&amp;lt;/b&amp;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;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует несколько последовательных реализаций алгоритма. С одной из них можно ознакомиться по ссылке &amp;lt;ref name=&amp;quot;tra&amp;quot;&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS &amp;lt;ref name=&amp;quot;tru&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&amp;lt;/ref&amp;gt; , hMETIS &amp;lt;ref name=&amp;quot;tri&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref name=&amp;quot;tro&amp;quot;&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &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;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Артем Таран</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9740</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9740"/>
		<updated>2016-10-15T13:38:33Z</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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]] (разделы 1.1 - 1.10, 2.7), [[Участник:ShimchikN|Шимчик Никита Владимирович]] (разделы 1.1 - 1.10, 2.7).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON&amp;lt;ref name=&amp;quot;rt&amp;quot;&amp;gt;http://www-users.cs.umn.edu/~han/dmclass/chameleon.pdf&amp;lt;/ref&amp;gt; - алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|1000px|thumb|center|Графы k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4) граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа&amp;lt;ref name=&amp;quot;rty&amp;quot;&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;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
  [[File:Chameleon_inforgraph.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; ближайших соседей. Таким образом, его параллельная сложность составляет O(n).&lt;br /&gt;
&lt;br /&gt;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап распараллелить не представляется возможным, поскольку выбор очередной пары кластеров для сравнения зависит от результата выполнения предыдущей итерации, поэтому сложность оставляется равной &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
У второго и третьего этапов алгоритма сложно полностью оценить ресурсы параллелизма. Второй этап возможно частично распараллелить, в том время третий этап в основном является последовательным. &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;b&amp;gt;Детерминированность:&amp;lt;/b&amp;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;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует несколько последовательных реализаций алгоритма. С одной из них можно ознакомиться по ссылке &amp;lt;ref name=&amp;quot;tra&amp;quot;&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS &amp;lt;ref name=&amp;quot;tru&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&amp;lt;/ref&amp;gt; , hMETIS &amp;lt;ref name=&amp;quot;tri&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref name=&amp;quot;tro&amp;quot;&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &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;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Артем Таран</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9730</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9730"/>
		<updated>2016-10-15T13:35:28Z</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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]] (разделы 1.1 - 1.10, 2.7), [[Участник:ShimchikN|Шимчик Никита Владимирович]] (разделы 1.1 - 1.10, 2.7).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON&amp;lt;ref name=&amp;quot;rt&amp;quot;&amp;gt;http://www-users.cs.umn.edu/~han/dmclass/chameleon.pdf&amp;lt;/ref&amp;gt; - алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|1000px|thumb|center|Графы k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4) граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;
&lt;br /&gt;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
  [[File:Chameleon_inforgraph.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; ближайших соседей. Таким образом, его параллельная сложность составляет O(n).&lt;br /&gt;
&lt;br /&gt;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап распараллелить не представляется возможным, поскольку выбор очередной пары кластеров для сравнения зависит от результата выполнения предыдущей итерации, поэтому сложность оставляется равной &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
У второго и третьего этапов алгоритма сложно полностью оценить ресурсы параллелизма. Второй этап возможно частично распараллелить, в том время третий этап в основном является последовательным. &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;b&amp;gt;Детерминированность:&amp;lt;/b&amp;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;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует несколько последовательных реализаций алгоритма. С одной из них можно ознакомиться по ссылке &amp;lt;ref name=&amp;quot;tra&amp;quot;&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS &amp;lt;ref name=&amp;quot;tru&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&amp;lt;/ref&amp;gt; , hMETIS &amp;lt;ref name=&amp;quot;tri&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref name=&amp;quot;tro&amp;quot;&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &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;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Артем Таран</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9713</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9713"/>
		<updated>2016-10-15T13:33:11Z</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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]] (разделы 1.1 - 1.10, 2.7), [[Участник:ShimchikN|Шимчик Никита Владимирович]] (разделы 1.1 - 1.10, 2.7).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON - алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|1000px|thumb|center|Графы k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4) граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;
&lt;br /&gt;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
  [[File:Chameleon_inforgraph.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; ближайших соседей. Таким образом, его параллельная сложность составляет O(n).&lt;br /&gt;
&lt;br /&gt;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап распараллелить не представляется возможным, поскольку выбор очередной пары кластеров для сравнения зависит от результата выполнения предыдущей итерации, поэтому сложность оставляется равной &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
У второго и третьего этапов алгоритма сложно полностью оценить ресурсы параллелизма. Второй этап возможно частично распараллелить, в том время третий этап в основном является последовательным. &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;b&amp;gt;Детерминированность:&amp;lt;/b&amp;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;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует несколько последовательных реализаций алгоритма. С одной из них можно ознакомиться по ссылке &amp;lt;ref name=&amp;quot;tra&amp;quot;&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS &amp;lt;ref name=&amp;quot;tru&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&amp;lt;/ref&amp;gt; , hMETIS &amp;lt;ref name=&amp;quot;tri&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref name=&amp;quot;tro&amp;quot;&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &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;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Артем Таран</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9709</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9709"/>
		<updated>2016-10-15T13:32:30Z</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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]] (разделы 1.1 - 1.10, 2.7), [[Участник:ShimchikN|Шимчик Никита Владимирович]] (разделы 1.1 - 1.10, 2.7).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON - алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|1000px|thumb|center|Графы k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4) граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;
&lt;br /&gt;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
  [[File:Chameleon_inforgraph.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; ближайших соседей. Таким образом, его параллельная сложность составляет O(n).&lt;br /&gt;
&lt;br /&gt;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап распараллелить не представляется возможным, поскольку выбор очередной пары кластеров для сравнения зависит от результата выполнения предыдущей итерации, поэтому сложность оставляется равной &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
У второго и третьего этапов алгоритма сложно полностью оценить ресурсы параллелизма. Второй этап возможно частично распараллелить, в том время третий этап в основном является последовательным. &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;b&amp;gt;Детерминированность:&amp;lt;/b&amp;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;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует несколько последовательных реализаций алгоритма. С одной из них можно ознакомиться по ссылке &amp;lt;ref name=&amp;quot;tra&amp;quot;&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS &amp;lt;ref name=&amp;quot;tru&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&amp;lt;/ref&amp;gt; , hMETIS &amp;lt;ref name=&amp;quot;tri&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref name=&amp;quot;tro&amp;quot;&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &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;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Артем Таран</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9701</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9701"/>
		<updated>2016-10-15T13:30: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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]] (разделы 1.1 - 1.10, 2.7), [[Участник:ShimchikN|Шимчик Никита Владимирович]] (разделы 1.1 - 1.10, 2.7).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON - относительно новый алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|1000px|thumb|center|Графы k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4) граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;
&lt;br /&gt;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
  [[File:Chameleon_inforgraph.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; ближайших соседей. Таким образом, его параллельная сложность составляет O(n).&lt;br /&gt;
&lt;br /&gt;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап распараллелить не представляется возможным, поскольку выбор очередной пары кластеров для сравнения зависит от результата выполнения предыдущей итерации, поэтому сложность оставляется равной &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
У второго и третьего этапов алгоритма сложно полностью оценить ресурсы параллелизма. Второй этап возможно частично распараллелить, в том время третий этап в основном является последовательным. &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;b&amp;gt;Детерминированность:&amp;lt;/b&amp;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;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует несколько последовательных реализаций алгоритма. С одной из них можно ознакомиться по ссылке &amp;lt;ref name=&amp;quot;tra&amp;quot;&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS &amp;lt;ref name=&amp;quot;tru&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&amp;lt;/ref&amp;gt; , hMETIS &amp;lt;ref name=&amp;quot;tri&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref name=&amp;quot;tro&amp;quot;&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &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;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Артем Таран</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9693</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9693"/>
		<updated>2016-10-15T13:28: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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]] (разделы 1.1 - 1.10), [[Участник:ShimchikN|Шимчик Никита Владимирович]] (разделы 1.1 - 1.10).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON - относительно новый алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|1000px|thumb|center|Графы k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4) граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;
&lt;br /&gt;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
  [[File:Chameleon_inforgraph.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; ближайших соседей. Таким образом, его параллельная сложность составляет O(n).&lt;br /&gt;
&lt;br /&gt;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап распараллелить не представляется возможным, поскольку выбор очередной пары кластеров для сравнения зависит от результата выполнения предыдущей итерации, поэтому сложность оставляется равной &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
У второго и третьего этапов алгоритма сложно полностью оценить ресурсы параллелизма. Второй этап возможно частично распараллелить, в том время третий этап в основном является последовательным. &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;b&amp;gt;Детерминированность:&amp;lt;/b&amp;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;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует несколько последовательных реализаций алгоритма. С одной из них можно ознакомиться по ссылке &amp;lt;ref name=&amp;quot;tra&amp;quot;&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS &amp;lt;ref name=&amp;quot;tru&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&amp;lt;/ref&amp;gt; , hMETIS &amp;lt;ref name=&amp;quot;tri&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref name=&amp;quot;tro&amp;quot;&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &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;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Артем Таран</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9690</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9690"/>
		<updated>2016-10-15T13:27: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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]] (разделы 1.1 - 1.10), [[Участник:ShimchikN|Шимчик Никита Владимирович]] (разделы 1.1 - 1.10).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON - относительно новый алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|1000px|thumb|center|Графы k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4) граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;
&lt;br /&gt;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
  [[File:Chameleon_inforgraph.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; ближайших соседей. Таким образом, его параллельная сложность составляет O(n).&lt;br /&gt;
&lt;br /&gt;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап распараллелить не представляется возможным, поскольку выбор очередной пары кластеров для сравнения зависит от результата выполнения предыдущей итерации, поэтому сложность оставляется равной &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
У второго и третьего этапов алгоритма сложно полностью оценить ресурсы параллелизма. Второй этап возможно частично распараллеллить, в том время третий этап в основном является последовательным. &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;b&amp;gt;Детерминированность:&amp;lt;/b&amp;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;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует несколько последовательных реализаций алгоритма. С одной из них можно ознакомиться по ссылке &amp;lt;ref name=&amp;quot;tra&amp;quot;&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS &amp;lt;ref name=&amp;quot;tru&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&amp;lt;/ref&amp;gt; , hMETIS &amp;lt;ref name=&amp;quot;tri&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref name=&amp;quot;tro&amp;quot;&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &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;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Артем Таран</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9689</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9689"/>
		<updated>2016-10-15T13:27:10Z</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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]] (разделы 1.1 - 1.10), [[Участник:ShimchikN|Шимчик Никита Владимирович]] (разделы 1.1 - 1.10).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON - относительно новый алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|1000px|thumb|center|Графы k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4) граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;
&lt;br /&gt;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
  [[File:Chameleon_inforgraph.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; ближайших соседей. Таким образом, его параллельная сложность составляет O(n).&lt;br /&gt;
&lt;br /&gt;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап распараллелить не представляется возможным, поскольку выбор очередной пары кластеров для сравнения зависит от результата выполнения предыдущей итерации, поэтому сложность оставляется равной &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
У второго и третьего этапов алгоритма сложно полностью оценить ресурсы параллелизма. Второй этап возможно частично распараллеллить, в том время третий этап в основном является последовательным. &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;b&amp;gt;Детерминированность:&amp;lt;/b&amp;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;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует несколько последовательных реализаций алгоритма. С одной из них можно ознакомиться по ссылке &amp;lt;ref name=&amp;quot;tra&amp;quot;&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS &amp;lt;ref name=&amp;quot;tru&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&amp;lt;/ref&amp;gt; , hMETIS &amp;lt;ref name=&amp;quot;tri&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref name=&amp;quot;tro&amp;quot;&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь [http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Артем Таран</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9686</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9686"/>
		<updated>2016-10-15T13:26:08Z</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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]] (разделы 1.1 - 1.10), [[Участник:ShimchikN|Шимчик Никита Владимирович]] (разделы 1.1 - 1.10).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON - относительно новый алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|1000px|thumb|center|Графы k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4) граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;
&lt;br /&gt;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
  [[File:Chameleon_inforgraph.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; ближайших соседей. Таким образом, его параллельная сложность составляет O(n).&lt;br /&gt;
&lt;br /&gt;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап распараллелить не представляется возможным, поскольку выбор очередной пары кластеров для сравнения зависит от результата выполнения предыдущей итерации, поэтому сложность оставляется равной &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
У второго и третьего этапов алгоритма сложно полностью оценить ресурсы параллелизма. Второй этап возможно частично распараллеллить, в том время третий этап в основном является последовательным. &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;b&amp;gt;Детерминированность:&amp;lt;/b&amp;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;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует несколько последовательных реализаций алгоритма. С одной из них можно ознакомиться по ссылке &amp;lt;ref name=&amp;quot;1&amp;quot;&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS &amp;lt;ref name=&amp;quot;2&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&amp;lt;/ref&amp;gt; , hMETIS &amp;lt;ref name=&amp;quot;3&amp;quot;&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref name=&amp;quot;4&amp;quot;&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь [http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Артем Таран</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9637</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9637"/>
		<updated>2016-10-15T13:15: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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]] (разделы 1.1 - 1.10), [[Участник:ShimchikN|Шимчик Никита Владимирович]] (разделы 1.1 - 1.10).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON - относительно новый алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|1000px|thumb|center|Графы k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4) граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;
&lt;br /&gt;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
  [[File:Chameleon_inforgraph.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; ближайших соседей. Таким образом, его параллельная сложность составляет O(n).&lt;br /&gt;
&lt;br /&gt;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап распараллелить не представляется возможным, поскольку выбор очередной пары кластеров для сравнения зависит от результата выполнения предыдущей итерации, поэтому сложность оставляется равной &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
У второго и третьего этапов алгоритма сложно полностью оценить ресурсы параллелизма. Второй этап возможно частично распараллеллить, в том время третий этап в основном является последовательным. &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;b&amp;gt;Детерминированность:&amp;lt;/b&amp;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;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует несколько последовательных реализаций алгоритма. С одной из них можно ознакомиться по ссылке [http://www.codeforge.com/article/192925].&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS [http://glaros.dtc.umn.edu/gkhome/metis/metis/overview] , hMETIS [http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview] и RANN [https://cran.r-project.org/web/packages/RANN/index.html].&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь [http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Артем Таран</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9486</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9486"/>
		<updated>2016-10-15T12:34:36Z</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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]] (разделы 1.1 - 1.10), [[Участник:ShimchikN|Шимчик Никита Владимирович]] (разделы 1.1 - 1.10).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON - относительно новый алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|1000px|thumb|center|Графы k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4) граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;
&lt;br /&gt;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
  [[File:Chameleon_inforgraph.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; ближайших соседей. Таким образом, его параллельная сложность составляет O(n).&lt;br /&gt;
&lt;br /&gt;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап распараллелить не представляется возможным, поскольку выбор очередной пары кластеров для сравнения зависит от результата выполнения предыдущей итерации, поэтому сложность оставляется равной &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Детерминированность:&amp;lt;/b&amp;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;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует несколько последовательных реализаций алгоритма. С одной из них можно ознакомиться по ссылке [http://www.codeforge.com/article/192925].&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS [http://glaros.dtc.umn.edu/gkhome/metis/metis/overview] , hMETIS [http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview] и RANN [https://cran.r-project.org/web/packages/RANN/index.html].&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь [http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм выполняется в два этапа.&lt;br /&gt;
&lt;br /&gt;
На первом этапе CHAMELEON использует алгоритм разделения графа для получения набора относительно малых кластеров. На втором этапе, для объединения кластеров, полученных на первом этапе, в настоящие кластеры, используется иерархическая агломеративная кластеризация. Таким образом, алгоритм, фактически, является гибридным, построенным комбинацией графо-ориентированных и классических иерархических методов. Рассмотрим эти этапы подробнее.&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары. &lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|2000px|thumb|left|На рисунке изображены: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4)граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
Такое представление имеет целый ряд преимуществ.&lt;br /&gt;
&lt;br /&gt;
Во-первых, можно сразу убрать ребра в графе с достаточно малым весом (значением сходства).&lt;br /&gt;
&lt;br /&gt;
Во-вторых, возможно динамически определить для различных участков графа количество k ближайших соседей для вершин, на основе плотности данных отдельно взятого участка, которую, в свою очередь, можно определить на основе весов ребер.&lt;br /&gt;
&lt;br /&gt;
В-третьих, операции на графах (например, разделение графа), имеющих такое представление, выполняются гораздо быстрее, чем на полных графах.&lt;br /&gt;
&lt;br /&gt;
Обычно, k берется в пределах от 5 до 20 в зависимости от количества анализируемых объектов, и, как свидетельствуют авторы, выбор k почти не оказывает влияния на результаты кластеризации.&lt;br /&gt;
&lt;br /&gt;
Далее, алгоритм разделяет полученный граф на множество сравнительно малых подграфов. Разделение происходит последовательно. На каждом шаге выбирается под-граф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа, так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший под-граф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
На втором этапе, алгоритм последовательно объединяет кластеры, используя значение их относительной взаимной связности и относительного взаимного сходства. Только если оба эти значения достаточно высоки у двух кластеров, они объединяются.&lt;br /&gt;
&lt;br /&gt;
Относительная взаимная связность пары кластеров определяется абсолютной взаимной связностью кластеров, нормализованной с учетом внутренней связности (п. 0) каждого кластера (подграфа). Нормализация используется для того, чтобы исключить тенденцию к преимущественному объединению крупных кластеров, у которых, определенно, значение взаимной связности будет больше, вследствие их размера.&lt;br /&gt;
&lt;br /&gt;
Абсолютная взаимная связность между парой кластеров Ci и Сj определяется как сумма весов ребер, соединяющих вершины, принадлежащие Ci с вершинами из Сj. Эти ребра, фактически, входят в разделитель ребер графа, состоящего из кластеров Ci и Сj, и разбивающим его на подграфы Ci и Сj. Обозначается эта величина как  . Внутреннюю связность  кластера Ci можно вычислить как сумму ребер, входящих в разделитель ребер, разбивающий Ci на два совершенно равных подграфа.&lt;br /&gt;
&lt;br /&gt;
Относительная взаимная связность  пары кластеров Ci и Сj определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
Относительное взаимное сходство пары кластеров определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
Абсолютное взаимное сходство между парой кластеров Ci и Сj подсчитывается как среднее сходство между соединенными вершинами, принадлежащими Ci и Сj соответственно. Эти соединения обусловлены предыдущим (на первом этапе) разбиением общего графа, полученного на матрице сходства.&lt;br /&gt;
&lt;br /&gt;
Итак, относительное взаимное сходство  между парой кластеров Ci и Сj равно:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где  и  – средние веса ребер (значения сходства), принадлежащих разделителю ребер кластеров Ci и Сj соответственно, и  – средний вес ребер, соединяющих вершины Ci с вершинами Сj, причем ребра принадлежат разделителю ребер  , определенному ранее. Можно также подсчитать внутреннее сходство как среднее значение весов всех связей в кластере, однако использования разделителя ребер по мнению авторов метода предпочтительнее. Этот факт они связывают с тем, что связи между объектами, помещенными в один кластер на ранних этапах объединения, сильнее, чем на поздних.&lt;br /&gt;
&lt;br /&gt;
Далее, алгоритм применяет агломеративную иерархическую кластеризацию с использованием вышеозначенных показателей. Причем существует две стратегии их учета. Первая подразумевает наличие некоторых пороговых значений. T­RI и T­RC. В соответствии с этой стратегией, алгоритм для каждого кластера Ci проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер Сj, с которым у кластера Ci получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры T­RI и T­RC могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основное отличие данного подхода от классических агломеративных иерархических методов в том, что, во-первых, на каждом шаге могут быть объединены несколько кластеров, а, во-вторых, на каком-то этапе ни одна пара кластеров не будет удовлетворять вышеуказанным условиям и такое разбиение будет считаться оптимальным, то есть в конце может не получиться один всеохватывающий кластер. Если данное разбиение не удовлетворяет выбранным критериям, то пороговые значения можно уменьшить.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где a выбирается пользователем. Если a &amp;gt; 1, то алгоритм придает большее значение относительному взаимному сходству, а если a &amp;lt; 1, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа.&lt;br /&gt;
&lt;br /&gt;
Общая временная сложность этого алгоритма выражается как  , где n – количество анализируемых документов, m­ – количество получившихся после первого этапа малых кластеров.&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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9480</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9480"/>
		<updated>2016-10-15T12:34:06Z</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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]] (разделы 1.1 - 1.10), [[Участник:ShimchikN|Шимчик Никита Владимирович]] (разделы 1.1 - 1.10).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON - относительно новый алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|1000px|thumb|center|Графы k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4) граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;
&lt;br /&gt;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
  [[File:Chameleon_inforgraph.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; ближайших соседей. Таким образом, его параллельная сложность составляет O(n).&lt;br /&gt;
&lt;br /&gt;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап распараллелить не представляется возможным, поскольку выбор очередной пары кластеров для сравнения зависит от результата выполнения предыдущей итерации, поэтому сложность оставляется равной &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Детерминированность: Важной особенностью данного алгоритма является его недетерминированность. Несмотря на то, что 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;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует несколько последовательных реализаций алгоритма. С одной из них можно ознакомиться по ссылке [http://www.codeforge.com/article/192925].&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS [http://glaros.dtc.umn.edu/gkhome/metis/metis/overview] , hMETIS [http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview] и RANN [https://cran.r-project.org/web/packages/RANN/index.html].&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь [http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм выполняется в два этапа.&lt;br /&gt;
&lt;br /&gt;
На первом этапе CHAMELEON использует алгоритм разделения графа для получения набора относительно малых кластеров. На втором этапе, для объединения кластеров, полученных на первом этапе, в настоящие кластеры, используется иерархическая агломеративная кластеризация. Таким образом, алгоритм, фактически, является гибридным, построенным комбинацией графо-ориентированных и классических иерархических методов. Рассмотрим эти этапы подробнее.&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары. &lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|2000px|thumb|left|На рисунке изображены: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4)граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
Такое представление имеет целый ряд преимуществ.&lt;br /&gt;
&lt;br /&gt;
Во-первых, можно сразу убрать ребра в графе с достаточно малым весом (значением сходства).&lt;br /&gt;
&lt;br /&gt;
Во-вторых, возможно динамически определить для различных участков графа количество k ближайших соседей для вершин, на основе плотности данных отдельно взятого участка, которую, в свою очередь, можно определить на основе весов ребер.&lt;br /&gt;
&lt;br /&gt;
В-третьих, операции на графах (например, разделение графа), имеющих такое представление, выполняются гораздо быстрее, чем на полных графах.&lt;br /&gt;
&lt;br /&gt;
Обычно, k берется в пределах от 5 до 20 в зависимости от количества анализируемых объектов, и, как свидетельствуют авторы, выбор k почти не оказывает влияния на результаты кластеризации.&lt;br /&gt;
&lt;br /&gt;
Далее, алгоритм разделяет полученный граф на множество сравнительно малых подграфов. Разделение происходит последовательно. На каждом шаге выбирается под-граф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа, так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший под-граф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
На втором этапе, алгоритм последовательно объединяет кластеры, используя значение их относительной взаимной связности и относительного взаимного сходства. Только если оба эти значения достаточно высоки у двух кластеров, они объединяются.&lt;br /&gt;
&lt;br /&gt;
Относительная взаимная связность пары кластеров определяется абсолютной взаимной связностью кластеров, нормализованной с учетом внутренней связности (п. 0) каждого кластера (подграфа). Нормализация используется для того, чтобы исключить тенденцию к преимущественному объединению крупных кластеров, у которых, определенно, значение взаимной связности будет больше, вследствие их размера.&lt;br /&gt;
&lt;br /&gt;
Абсолютная взаимная связность между парой кластеров Ci и Сj определяется как сумма весов ребер, соединяющих вершины, принадлежащие Ci с вершинами из Сj. Эти ребра, фактически, входят в разделитель ребер графа, состоящего из кластеров Ci и Сj, и разбивающим его на подграфы Ci и Сj. Обозначается эта величина как  . Внутреннюю связность  кластера Ci можно вычислить как сумму ребер, входящих в разделитель ребер, разбивающий Ci на два совершенно равных подграфа.&lt;br /&gt;
&lt;br /&gt;
Относительная взаимная связность  пары кластеров Ci и Сj определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
Относительное взаимное сходство пары кластеров определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
Абсолютное взаимное сходство между парой кластеров Ci и Сj подсчитывается как среднее сходство между соединенными вершинами, принадлежащими Ci и Сj соответственно. Эти соединения обусловлены предыдущим (на первом этапе) разбиением общего графа, полученного на матрице сходства.&lt;br /&gt;
&lt;br /&gt;
Итак, относительное взаимное сходство  между парой кластеров Ci и Сj равно:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где  и  – средние веса ребер (значения сходства), принадлежащих разделителю ребер кластеров Ci и Сj соответственно, и  – средний вес ребер, соединяющих вершины Ci с вершинами Сj, причем ребра принадлежат разделителю ребер  , определенному ранее. Можно также подсчитать внутреннее сходство как среднее значение весов всех связей в кластере, однако использования разделителя ребер по мнению авторов метода предпочтительнее. Этот факт они связывают с тем, что связи между объектами, помещенными в один кластер на ранних этапах объединения, сильнее, чем на поздних.&lt;br /&gt;
&lt;br /&gt;
Далее, алгоритм применяет агломеративную иерархическую кластеризацию с использованием вышеозначенных показателей. Причем существует две стратегии их учета. Первая подразумевает наличие некоторых пороговых значений. T­RI и T­RC. В соответствии с этой стратегией, алгоритм для каждого кластера Ci проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер Сj, с которым у кластера Ci получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры T­RI и T­RC могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основное отличие данного подхода от классических агломеративных иерархических методов в том, что, во-первых, на каждом шаге могут быть объединены несколько кластеров, а, во-вторых, на каком-то этапе ни одна пара кластеров не будет удовлетворять вышеуказанным условиям и такое разбиение будет считаться оптимальным, то есть в конце может не получиться один всеохватывающий кластер. Если данное разбиение не удовлетворяет выбранным критериям, то пороговые значения можно уменьшить.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где a выбирается пользователем. Если a &amp;gt; 1, то алгоритм придает большее значение относительному взаимному сходству, а если a &amp;lt; 1, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа.&lt;br /&gt;
&lt;br /&gt;
Общая временная сложность этого алгоритма выражается как  , где n – количество анализируемых документов, m­ – количество получившихся после первого этапа малых кластеров.&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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9342</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9342"/>
		<updated>2016-10-15T11:51:43Z</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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]]( разделы 1.1 - 1.10), [[Участник:ShimchikN|Шимчик Никита Владимирович]]( разделы 1.1 - 1.10).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON - относительно новый алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|1000px|thumb|center|Графы k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4) граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;
&lt;br /&gt;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&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;n&amp;lt;/math&amp;gt; процессами: в этом случае каждому процессу назначается своя точка и происходит поиск &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Таким образом, его параллельная сложность составляет O(n).&lt;br /&gt;
&lt;br /&gt;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап распараллелить не представляется возможным, поскольку выбор очередной пары кластеров для сравнения зависит от результата выполнения предыдущей итерации, поэтому сложность оставляется равной &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует несколько последовательных реализаций алгоритма. С одной из них можно ознакомиться по ссылке [http://www.codeforge.com/article/192925].&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS [http://glaros.dtc.umn.edu/gkhome/metis/metis/overview] , hMETIS [http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview] и RANN [https://cran.r-project.org/web/packages/RANN/index.html].&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь [http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм выполняется в два этапа.&lt;br /&gt;
&lt;br /&gt;
На первом этапе CHAMELEON использует алгоритм разделения графа для получения набора относительно малых кластеров. На втором этапе, для объединения кластеров, полученных на первом этапе, в настоящие кластеры, используется иерархическая агломеративная кластеризация. Таким образом, алгоритм, фактически, является гибридным, построенным комбинацией графо-ориентированных и классических иерархических методов. Рассмотрим эти этапы подробнее.&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары. &lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|2000px|thumb|left|На рисунке изображены: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4)граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
Такое представление имеет целый ряд преимуществ.&lt;br /&gt;
&lt;br /&gt;
Во-первых, можно сразу убрать ребра в графе с достаточно малым весом (значением сходства).&lt;br /&gt;
&lt;br /&gt;
Во-вторых, возможно динамически определить для различных участков графа количество k ближайших соседей для вершин, на основе плотности данных отдельно взятого участка, которую, в свою очередь, можно определить на основе весов ребер.&lt;br /&gt;
&lt;br /&gt;
В-третьих, операции на графах (например, разделение графа), имеющих такое представление, выполняются гораздо быстрее, чем на полных графах.&lt;br /&gt;
&lt;br /&gt;
Обычно, k берется в пределах от 5 до 20 в зависимости от количества анализируемых объектов, и, как свидетельствуют авторы, выбор k почти не оказывает влияния на результаты кластеризации.&lt;br /&gt;
&lt;br /&gt;
Далее, алгоритм разделяет полученный граф на множество сравнительно малых подграфов. Разделение происходит последовательно. На каждом шаге выбирается под-граф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа, так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший под-граф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
На втором этапе, алгоритм последовательно объединяет кластеры, используя значение их относительной взаимной связности и относительного взаимного сходства. Только если оба эти значения достаточно высоки у двух кластеров, они объединяются.&lt;br /&gt;
&lt;br /&gt;
Относительная взаимная связность пары кластеров определяется абсолютной взаимной связностью кластеров, нормализованной с учетом внутренней связности (п. 0) каждого кластера (подграфа). Нормализация используется для того, чтобы исключить тенденцию к преимущественному объединению крупных кластеров, у которых, определенно, значение взаимной связности будет больше, вследствие их размера.&lt;br /&gt;
&lt;br /&gt;
Абсолютная взаимная связность между парой кластеров Ci и Сj определяется как сумма весов ребер, соединяющих вершины, принадлежащие Ci с вершинами из Сj. Эти ребра, фактически, входят в разделитель ребер графа, состоящего из кластеров Ci и Сj, и разбивающим его на подграфы Ci и Сj. Обозначается эта величина как  . Внутреннюю связность  кластера Ci можно вычислить как сумму ребер, входящих в разделитель ребер, разбивающий Ci на два совершенно равных подграфа.&lt;br /&gt;
&lt;br /&gt;
Относительная взаимная связность  пары кластеров Ci и Сj определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
Относительное взаимное сходство пары кластеров определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
Абсолютное взаимное сходство между парой кластеров Ci и Сj подсчитывается как среднее сходство между соединенными вершинами, принадлежащими Ci и Сj соответственно. Эти соединения обусловлены предыдущим (на первом этапе) разбиением общего графа, полученного на матрице сходства.&lt;br /&gt;
&lt;br /&gt;
Итак, относительное взаимное сходство  между парой кластеров Ci и Сj равно:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где  и  – средние веса ребер (значения сходства), принадлежащих разделителю ребер кластеров Ci и Сj соответственно, и  – средний вес ребер, соединяющих вершины Ci с вершинами Сj, причем ребра принадлежат разделителю ребер  , определенному ранее. Можно также подсчитать внутреннее сходство как среднее значение весов всех связей в кластере, однако использования разделителя ребер по мнению авторов метода предпочтительнее. Этот факт они связывают с тем, что связи между объектами, помещенными в один кластер на ранних этапах объединения, сильнее, чем на поздних.&lt;br /&gt;
&lt;br /&gt;
Далее, алгоритм применяет агломеративную иерархическую кластеризацию с использованием вышеозначенных показателей. Причем существует две стратегии их учета. Первая подразумевает наличие некоторых пороговых значений. T­RI и T­RC. В соответствии с этой стратегией, алгоритм для каждого кластера Ci проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер Сj, с которым у кластера Ci получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры T­RI и T­RC могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основное отличие данного подхода от классических агломеративных иерархических методов в том, что, во-первых, на каждом шаге могут быть объединены несколько кластеров, а, во-вторых, на каком-то этапе ни одна пара кластеров не будет удовлетворять вышеуказанным условиям и такое разбиение будет считаться оптимальным, то есть в конце может не получиться один всеохватывающий кластер. Если данное разбиение не удовлетворяет выбранным критериям, то пороговые значения можно уменьшить.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где a выбирается пользователем. Если a &amp;gt; 1, то алгоритм придает большее значение относительному взаимному сходству, а если a &amp;lt; 1, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа.&lt;br /&gt;
&lt;br /&gt;
Общая временная сложность этого алгоритма выражается как  , где n – количество анализируемых документов, m­ – количество получившихся после первого этапа малых кластеров.&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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9340</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9340"/>
		<updated>2016-10-15T11:51:20Z</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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]]( разделы 1.1 - 1.10), [[Участник:ShimchikN|Шимчик Никита Владимирович]]( разделы 1.1 - 1.10).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON - относительно новый алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|1000px|thumb|center|Графы k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4)граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;
&lt;br /&gt;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&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;n&amp;lt;/math&amp;gt; процессами: в этом случае каждому процессу назначается своя точка и происходит поиск &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Таким образом, его параллельная сложность составляет O(n).&lt;br /&gt;
&lt;br /&gt;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап распараллелить не представляется возможным, поскольку выбор очередной пары кластеров для сравнения зависит от результата выполнения предыдущей итерации, поэтому сложность оставляется равной &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует несколько последовательных реализаций алгоритма. С одной из них можно ознакомиться по ссылке [http://www.codeforge.com/article/192925].&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS [http://glaros.dtc.umn.edu/gkhome/metis/metis/overview] , hMETIS [http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview] и RANN [https://cran.r-project.org/web/packages/RANN/index.html].&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь [http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм выполняется в два этапа.&lt;br /&gt;
&lt;br /&gt;
На первом этапе CHAMELEON использует алгоритм разделения графа для получения набора относительно малых кластеров. На втором этапе, для объединения кластеров, полученных на первом этапе, в настоящие кластеры, используется иерархическая агломеративная кластеризация. Таким образом, алгоритм, фактически, является гибридным, построенным комбинацией графо-ориентированных и классических иерархических методов. Рассмотрим эти этапы подробнее.&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары. &lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|2000px|thumb|left|На рисунке изображены: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4)граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
Такое представление имеет целый ряд преимуществ.&lt;br /&gt;
&lt;br /&gt;
Во-первых, можно сразу убрать ребра в графе с достаточно малым весом (значением сходства).&lt;br /&gt;
&lt;br /&gt;
Во-вторых, возможно динамически определить для различных участков графа количество k ближайших соседей для вершин, на основе плотности данных отдельно взятого участка, которую, в свою очередь, можно определить на основе весов ребер.&lt;br /&gt;
&lt;br /&gt;
В-третьих, операции на графах (например, разделение графа), имеющих такое представление, выполняются гораздо быстрее, чем на полных графах.&lt;br /&gt;
&lt;br /&gt;
Обычно, k берется в пределах от 5 до 20 в зависимости от количества анализируемых объектов, и, как свидетельствуют авторы, выбор k почти не оказывает влияния на результаты кластеризации.&lt;br /&gt;
&lt;br /&gt;
Далее, алгоритм разделяет полученный граф на множество сравнительно малых подграфов. Разделение происходит последовательно. На каждом шаге выбирается под-граф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа, так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший под-граф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
На втором этапе, алгоритм последовательно объединяет кластеры, используя значение их относительной взаимной связности и относительного взаимного сходства. Только если оба эти значения достаточно высоки у двух кластеров, они объединяются.&lt;br /&gt;
&lt;br /&gt;
Относительная взаимная связность пары кластеров определяется абсолютной взаимной связностью кластеров, нормализованной с учетом внутренней связности (п. 0) каждого кластера (подграфа). Нормализация используется для того, чтобы исключить тенденцию к преимущественному объединению крупных кластеров, у которых, определенно, значение взаимной связности будет больше, вследствие их размера.&lt;br /&gt;
&lt;br /&gt;
Абсолютная взаимная связность между парой кластеров Ci и Сj определяется как сумма весов ребер, соединяющих вершины, принадлежащие Ci с вершинами из Сj. Эти ребра, фактически, входят в разделитель ребер графа, состоящего из кластеров Ci и Сj, и разбивающим его на подграфы Ci и Сj. Обозначается эта величина как  . Внутреннюю связность  кластера Ci можно вычислить как сумму ребер, входящих в разделитель ребер, разбивающий Ci на два совершенно равных подграфа.&lt;br /&gt;
&lt;br /&gt;
Относительная взаимная связность  пары кластеров Ci и Сj определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
Относительное взаимное сходство пары кластеров определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
Абсолютное взаимное сходство между парой кластеров Ci и Сj подсчитывается как среднее сходство между соединенными вершинами, принадлежащими Ci и Сj соответственно. Эти соединения обусловлены предыдущим (на первом этапе) разбиением общего графа, полученного на матрице сходства.&lt;br /&gt;
&lt;br /&gt;
Итак, относительное взаимное сходство  между парой кластеров Ci и Сj равно:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где  и  – средние веса ребер (значения сходства), принадлежащих разделителю ребер кластеров Ci и Сj соответственно, и  – средний вес ребер, соединяющих вершины Ci с вершинами Сj, причем ребра принадлежат разделителю ребер  , определенному ранее. Можно также подсчитать внутреннее сходство как среднее значение весов всех связей в кластере, однако использования разделителя ребер по мнению авторов метода предпочтительнее. Этот факт они связывают с тем, что связи между объектами, помещенными в один кластер на ранних этапах объединения, сильнее, чем на поздних.&lt;br /&gt;
&lt;br /&gt;
Далее, алгоритм применяет агломеративную иерархическую кластеризацию с использованием вышеозначенных показателей. Причем существует две стратегии их учета. Первая подразумевает наличие некоторых пороговых значений. T­RI и T­RC. В соответствии с этой стратегией, алгоритм для каждого кластера Ci проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер Сj, с которым у кластера Ci получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры T­RI и T­RC могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основное отличие данного подхода от классических агломеративных иерархических методов в том, что, во-первых, на каждом шаге могут быть объединены несколько кластеров, а, во-вторых, на каком-то этапе ни одна пара кластеров не будет удовлетворять вышеуказанным условиям и такое разбиение будет считаться оптимальным, то есть в конце может не получиться один всеохватывающий кластер. Если данное разбиение не удовлетворяет выбранным критериям, то пороговые значения можно уменьшить.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где a выбирается пользователем. Если a &amp;gt; 1, то алгоритм придает большее значение относительному взаимному сходству, а если a &amp;lt; 1, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа.&lt;br /&gt;
&lt;br /&gt;
Общая временная сложность этого алгоритма выражается как  , где n – количество анализируемых документов, m­ – количество получившихся после первого этапа малых кластеров.&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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9334</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9334"/>
		<updated>2016-10-15T11:50: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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]]( разделы 1.1 - 1.10), [[Участник:ShimchikN|Шимчик Никита Владимирович]]( разделы 1.1 - 1.10).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON - относительно новый алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|1000px|thumb|center|На рисунке изображен принцип k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4)граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;
&lt;br /&gt;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&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;n&amp;lt;/math&amp;gt; процессами: в этом случае каждому процессу назначается своя точка и происходит поиск &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Таким образом, его параллельная сложность составляет O(n).&lt;br /&gt;
&lt;br /&gt;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап распараллелить не представляется возможным, поскольку выбор очередной пары кластеров для сравнения зависит от результата выполнения предыдущей итерации, поэтому сложность оставляется равной &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует несколько последовательных реализаций алгоритма. С одной из них можно ознакомиться по ссылке [http://www.codeforge.com/article/192925].&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS [http://glaros.dtc.umn.edu/gkhome/metis/metis/overview] , hMETIS [http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview] и RANN [https://cran.r-project.org/web/packages/RANN/index.html].&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь [http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм выполняется в два этапа.&lt;br /&gt;
&lt;br /&gt;
На первом этапе CHAMELEON использует алгоритм разделения графа для получения набора относительно малых кластеров. На втором этапе, для объединения кластеров, полученных на первом этапе, в настоящие кластеры, используется иерархическая агломеративная кластеризация. Таким образом, алгоритм, фактически, является гибридным, построенным комбинацией графо-ориентированных и классических иерархических методов. Рассмотрим эти этапы подробнее.&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары. &lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|2000px|thumb|left|На рисунке изображены: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4)граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
Такое представление имеет целый ряд преимуществ.&lt;br /&gt;
&lt;br /&gt;
Во-первых, можно сразу убрать ребра в графе с достаточно малым весом (значением сходства).&lt;br /&gt;
&lt;br /&gt;
Во-вторых, возможно динамически определить для различных участков графа количество k ближайших соседей для вершин, на основе плотности данных отдельно взятого участка, которую, в свою очередь, можно определить на основе весов ребер.&lt;br /&gt;
&lt;br /&gt;
В-третьих, операции на графах (например, разделение графа), имеющих такое представление, выполняются гораздо быстрее, чем на полных графах.&lt;br /&gt;
&lt;br /&gt;
Обычно, k берется в пределах от 5 до 20 в зависимости от количества анализируемых объектов, и, как свидетельствуют авторы, выбор k почти не оказывает влияния на результаты кластеризации.&lt;br /&gt;
&lt;br /&gt;
Далее, алгоритм разделяет полученный граф на множество сравнительно малых подграфов. Разделение происходит последовательно. На каждом шаге выбирается под-граф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа, так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший под-граф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
На втором этапе, алгоритм последовательно объединяет кластеры, используя значение их относительной взаимной связности и относительного взаимного сходства. Только если оба эти значения достаточно высоки у двух кластеров, они объединяются.&lt;br /&gt;
&lt;br /&gt;
Относительная взаимная связность пары кластеров определяется абсолютной взаимной связностью кластеров, нормализованной с учетом внутренней связности (п. 0) каждого кластера (подграфа). Нормализация используется для того, чтобы исключить тенденцию к преимущественному объединению крупных кластеров, у которых, определенно, значение взаимной связности будет больше, вследствие их размера.&lt;br /&gt;
&lt;br /&gt;
Абсолютная взаимная связность между парой кластеров Ci и Сj определяется как сумма весов ребер, соединяющих вершины, принадлежащие Ci с вершинами из Сj. Эти ребра, фактически, входят в разделитель ребер графа, состоящего из кластеров Ci и Сj, и разбивающим его на подграфы Ci и Сj. Обозначается эта величина как  . Внутреннюю связность  кластера Ci можно вычислить как сумму ребер, входящих в разделитель ребер, разбивающий Ci на два совершенно равных подграфа.&lt;br /&gt;
&lt;br /&gt;
Относительная взаимная связность  пары кластеров Ci и Сj определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
Относительное взаимное сходство пары кластеров определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
Абсолютное взаимное сходство между парой кластеров Ci и Сj подсчитывается как среднее сходство между соединенными вершинами, принадлежащими Ci и Сj соответственно. Эти соединения обусловлены предыдущим (на первом этапе) разбиением общего графа, полученного на матрице сходства.&lt;br /&gt;
&lt;br /&gt;
Итак, относительное взаимное сходство  между парой кластеров Ci и Сj равно:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где  и  – средние веса ребер (значения сходства), принадлежащих разделителю ребер кластеров Ci и Сj соответственно, и  – средний вес ребер, соединяющих вершины Ci с вершинами Сj, причем ребра принадлежат разделителю ребер  , определенному ранее. Можно также подсчитать внутреннее сходство как среднее значение весов всех связей в кластере, однако использования разделителя ребер по мнению авторов метода предпочтительнее. Этот факт они связывают с тем, что связи между объектами, помещенными в один кластер на ранних этапах объединения, сильнее, чем на поздних.&lt;br /&gt;
&lt;br /&gt;
Далее, алгоритм применяет агломеративную иерархическую кластеризацию с использованием вышеозначенных показателей. Причем существует две стратегии их учета. Первая подразумевает наличие некоторых пороговых значений. T­RI и T­RC. В соответствии с этой стратегией, алгоритм для каждого кластера Ci проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер Сj, с которым у кластера Ci получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры T­RI и T­RC могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основное отличие данного подхода от классических агломеративных иерархических методов в том, что, во-первых, на каждом шаге могут быть объединены несколько кластеров, а, во-вторых, на каком-то этапе ни одна пара кластеров не будет удовлетворять вышеуказанным условиям и такое разбиение будет считаться оптимальным, то есть в конце может не получиться один всеохватывающий кластер. Если данное разбиение не удовлетворяет выбранным критериям, то пороговые значения можно уменьшить.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где a выбирается пользователем. Если a &amp;gt; 1, то алгоритм придает большее значение относительному взаимному сходству, а если a &amp;lt; 1, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа.&lt;br /&gt;
&lt;br /&gt;
Общая временная сложность этого алгоритма выражается как  , где n – количество анализируемых документов, m­ – количество получившихся после первого этапа малых кластеров.&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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9329</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9329"/>
		<updated>2016-10-15T11:47:49Z</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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]]( разделы 1.1 - 1.10), [[Участник:ShimchikN|Шимчик Никита Владимирович]]( разделы 1.1 - 1.10).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON - относительно новый алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|1000px| На рисунке изображен принцип k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4)граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;
&lt;br /&gt;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&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;n&amp;lt;/math&amp;gt; процессами: в этом случае каждому процессу назначается своя точка и происходит поиск &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Таким образом, его параллельная сложность составляет O(n).&lt;br /&gt;
&lt;br /&gt;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап распараллелить не представляется возможным, поскольку выбор очередной пары кластеров для сравнения зависит от результата выполнения предыдущей итерации, поэтому сложность оставляется равной &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует несколько последовательных реализаций алгоритма. С одной из них можно ознакомиться по ссылке [http://www.codeforge.com/article/192925].&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS [http://glaros.dtc.umn.edu/gkhome/metis/metis/overview] , hMETIS [http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview] и RANN [https://cran.r-project.org/web/packages/RANN/index.html].&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь [http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм выполняется в два этапа.&lt;br /&gt;
&lt;br /&gt;
На первом этапе CHAMELEON использует алгоритм разделения графа для получения набора относительно малых кластеров. На втором этапе, для объединения кластеров, полученных на первом этапе, в настоящие кластеры, используется иерархическая агломеративная кластеризация. Таким образом, алгоритм, фактически, является гибридным, построенным комбинацией графо-ориентированных и классических иерархических методов. Рассмотрим эти этапы подробнее.&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары. &lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|2000px|thumb|left|На рисунке изображены: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4)граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
Такое представление имеет целый ряд преимуществ.&lt;br /&gt;
&lt;br /&gt;
Во-первых, можно сразу убрать ребра в графе с достаточно малым весом (значением сходства).&lt;br /&gt;
&lt;br /&gt;
Во-вторых, возможно динамически определить для различных участков графа количество k ближайших соседей для вершин, на основе плотности данных отдельно взятого участка, которую, в свою очередь, можно определить на основе весов ребер.&lt;br /&gt;
&lt;br /&gt;
В-третьих, операции на графах (например, разделение графа), имеющих такое представление, выполняются гораздо быстрее, чем на полных графах.&lt;br /&gt;
&lt;br /&gt;
Обычно, k берется в пределах от 5 до 20 в зависимости от количества анализируемых объектов, и, как свидетельствуют авторы, выбор k почти не оказывает влияния на результаты кластеризации.&lt;br /&gt;
&lt;br /&gt;
Далее, алгоритм разделяет полученный граф на множество сравнительно малых подграфов. Разделение происходит последовательно. На каждом шаге выбирается под-граф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа, так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший под-граф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
На втором этапе, алгоритм последовательно объединяет кластеры, используя значение их относительной взаимной связности и относительного взаимного сходства. Только если оба эти значения достаточно высоки у двух кластеров, они объединяются.&lt;br /&gt;
&lt;br /&gt;
Относительная взаимная связность пары кластеров определяется абсолютной взаимной связностью кластеров, нормализованной с учетом внутренней связности (п. 0) каждого кластера (подграфа). Нормализация используется для того, чтобы исключить тенденцию к преимущественному объединению крупных кластеров, у которых, определенно, значение взаимной связности будет больше, вследствие их размера.&lt;br /&gt;
&lt;br /&gt;
Абсолютная взаимная связность между парой кластеров Ci и Сj определяется как сумма весов ребер, соединяющих вершины, принадлежащие Ci с вершинами из Сj. Эти ребра, фактически, входят в разделитель ребер графа, состоящего из кластеров Ci и Сj, и разбивающим его на подграфы Ci и Сj. Обозначается эта величина как  . Внутреннюю связность  кластера Ci можно вычислить как сумму ребер, входящих в разделитель ребер, разбивающий Ci на два совершенно равных подграфа.&lt;br /&gt;
&lt;br /&gt;
Относительная взаимная связность  пары кластеров Ci и Сj определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
Относительное взаимное сходство пары кластеров определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
Абсолютное взаимное сходство между парой кластеров Ci и Сj подсчитывается как среднее сходство между соединенными вершинами, принадлежащими Ci и Сj соответственно. Эти соединения обусловлены предыдущим (на первом этапе) разбиением общего графа, полученного на матрице сходства.&lt;br /&gt;
&lt;br /&gt;
Итак, относительное взаимное сходство  между парой кластеров Ci и Сj равно:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где  и  – средние веса ребер (значения сходства), принадлежащих разделителю ребер кластеров Ci и Сj соответственно, и  – средний вес ребер, соединяющих вершины Ci с вершинами Сj, причем ребра принадлежат разделителю ребер  , определенному ранее. Можно также подсчитать внутреннее сходство как среднее значение весов всех связей в кластере, однако использования разделителя ребер по мнению авторов метода предпочтительнее. Этот факт они связывают с тем, что связи между объектами, помещенными в один кластер на ранних этапах объединения, сильнее, чем на поздних.&lt;br /&gt;
&lt;br /&gt;
Далее, алгоритм применяет агломеративную иерархическую кластеризацию с использованием вышеозначенных показателей. Причем существует две стратегии их учета. Первая подразумевает наличие некоторых пороговых значений. T­RI и T­RC. В соответствии с этой стратегией, алгоритм для каждого кластера Ci проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер Сj, с которым у кластера Ci получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры T­RI и T­RC могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основное отличие данного подхода от классических агломеративных иерархических методов в том, что, во-первых, на каждом шаге могут быть объединены несколько кластеров, а, во-вторых, на каком-то этапе ни одна пара кластеров не будет удовлетворять вышеуказанным условиям и такое разбиение будет считаться оптимальным, то есть в конце может не получиться один всеохватывающий кластер. Если данное разбиение не удовлетворяет выбранным критериям, то пороговые значения можно уменьшить.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где a выбирается пользователем. Если a &amp;gt; 1, то алгоритм придает большее значение относительному взаимному сходству, а если a &amp;lt; 1, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа.&lt;br /&gt;
&lt;br /&gt;
Общая временная сложность этого алгоритма выражается как  , где n – количество анализируемых документов, m­ – количество получившихся после первого этапа малых кластеров.&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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9328</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9328"/>
		<updated>2016-10-15T11:47: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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]]( разделы 1.1 - 1.10), [[Участник:ShimchikN|Шимчик Никита Владимирович]]( разделы 1.1 - 1.10).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON - относительно новый алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|1000px|| На рисунке изображен принцип k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4)граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;
&lt;br /&gt;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&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;n&amp;lt;/math&amp;gt; процессами: в этом случае каждому процессу назначается своя точка и происходит поиск &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Таким образом, его параллельная сложность составляет O(n).&lt;br /&gt;
&lt;br /&gt;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап распараллелить не представляется возможным, поскольку выбор очередной пары кластеров для сравнения зависит от результата выполнения предыдущей итерации, поэтому сложность оставляется равной &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует несколько последовательных реализаций алгоритма. С одной из них можно ознакомиться по ссылке [http://www.codeforge.com/article/192925].&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS [http://glaros.dtc.umn.edu/gkhome/metis/metis/overview] , hMETIS [http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview] и RANN [https://cran.r-project.org/web/packages/RANN/index.html].&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь [http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм выполняется в два этапа.&lt;br /&gt;
&lt;br /&gt;
На первом этапе CHAMELEON использует алгоритм разделения графа для получения набора относительно малых кластеров. На втором этапе, для объединения кластеров, полученных на первом этапе, в настоящие кластеры, используется иерархическая агломеративная кластеризация. Таким образом, алгоритм, фактически, является гибридным, построенным комбинацией графо-ориентированных и классических иерархических методов. Рассмотрим эти этапы подробнее.&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары. &lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|2000px|thumb|left|На рисунке изображены: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4)граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
Такое представление имеет целый ряд преимуществ.&lt;br /&gt;
&lt;br /&gt;
Во-первых, можно сразу убрать ребра в графе с достаточно малым весом (значением сходства).&lt;br /&gt;
&lt;br /&gt;
Во-вторых, возможно динамически определить для различных участков графа количество k ближайших соседей для вершин, на основе плотности данных отдельно взятого участка, которую, в свою очередь, можно определить на основе весов ребер.&lt;br /&gt;
&lt;br /&gt;
В-третьих, операции на графах (например, разделение графа), имеющих такое представление, выполняются гораздо быстрее, чем на полных графах.&lt;br /&gt;
&lt;br /&gt;
Обычно, k берется в пределах от 5 до 20 в зависимости от количества анализируемых объектов, и, как свидетельствуют авторы, выбор k почти не оказывает влияния на результаты кластеризации.&lt;br /&gt;
&lt;br /&gt;
Далее, алгоритм разделяет полученный граф на множество сравнительно малых подграфов. Разделение происходит последовательно. На каждом шаге выбирается под-граф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа, так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший под-граф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
На втором этапе, алгоритм последовательно объединяет кластеры, используя значение их относительной взаимной связности и относительного взаимного сходства. Только если оба эти значения достаточно высоки у двух кластеров, они объединяются.&lt;br /&gt;
&lt;br /&gt;
Относительная взаимная связность пары кластеров определяется абсолютной взаимной связностью кластеров, нормализованной с учетом внутренней связности (п. 0) каждого кластера (подграфа). Нормализация используется для того, чтобы исключить тенденцию к преимущественному объединению крупных кластеров, у которых, определенно, значение взаимной связности будет больше, вследствие их размера.&lt;br /&gt;
&lt;br /&gt;
Абсолютная взаимная связность между парой кластеров Ci и Сj определяется как сумма весов ребер, соединяющих вершины, принадлежащие Ci с вершинами из Сj. Эти ребра, фактически, входят в разделитель ребер графа, состоящего из кластеров Ci и Сj, и разбивающим его на подграфы Ci и Сj. Обозначается эта величина как  . Внутреннюю связность  кластера Ci можно вычислить как сумму ребер, входящих в разделитель ребер, разбивающий Ci на два совершенно равных подграфа.&lt;br /&gt;
&lt;br /&gt;
Относительная взаимная связность  пары кластеров Ci и Сj определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
Относительное взаимное сходство пары кластеров определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
Абсолютное взаимное сходство между парой кластеров Ci и Сj подсчитывается как среднее сходство между соединенными вершинами, принадлежащими Ci и Сj соответственно. Эти соединения обусловлены предыдущим (на первом этапе) разбиением общего графа, полученного на матрице сходства.&lt;br /&gt;
&lt;br /&gt;
Итак, относительное взаимное сходство  между парой кластеров Ci и Сj равно:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где  и  – средние веса ребер (значения сходства), принадлежащих разделителю ребер кластеров Ci и Сj соответственно, и  – средний вес ребер, соединяющих вершины Ci с вершинами Сj, причем ребра принадлежат разделителю ребер  , определенному ранее. Можно также подсчитать внутреннее сходство как среднее значение весов всех связей в кластере, однако использования разделителя ребер по мнению авторов метода предпочтительнее. Этот факт они связывают с тем, что связи между объектами, помещенными в один кластер на ранних этапах объединения, сильнее, чем на поздних.&lt;br /&gt;
&lt;br /&gt;
Далее, алгоритм применяет агломеративную иерархическую кластеризацию с использованием вышеозначенных показателей. Причем существует две стратегии их учета. Первая подразумевает наличие некоторых пороговых значений. T­RI и T­RC. В соответствии с этой стратегией, алгоритм для каждого кластера Ci проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер Сj, с которым у кластера Ci получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры T­RI и T­RC могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основное отличие данного подхода от классических агломеративных иерархических методов в том, что, во-первых, на каждом шаге могут быть объединены несколько кластеров, а, во-вторых, на каком-то этапе ни одна пара кластеров не будет удовлетворять вышеуказанным условиям и такое разбиение будет считаться оптимальным, то есть в конце может не получиться один всеохватывающий кластер. Если данное разбиение не удовлетворяет выбранным критериям, то пороговые значения можно уменьшить.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где a выбирается пользователем. Если a &amp;gt; 1, то алгоритм придает большее значение относительному взаимному сходству, а если a &amp;lt; 1, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа.&lt;br /&gt;
&lt;br /&gt;
Общая временная сложность этого алгоритма выражается как  , где n – количество анализируемых документов, m­ – количество получившихся после первого этапа малых кластеров.&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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9327</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9327"/>
		<updated>2016-10-15T11:46: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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]]( разделы 1.1 - 1.10), [[Участник:ShimchikN|Шимчик Никита Владимирович]]( разделы 1.1 - 1.10).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON - относительно новый алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|1000px|thumb| На рисунке изображен принцип k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4)граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;
&lt;br /&gt;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&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;n&amp;lt;/math&amp;gt; процессами: в этом случае каждому процессу назначается своя точка и происходит поиск &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Таким образом, его параллельная сложность составляет O(n).&lt;br /&gt;
&lt;br /&gt;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап распараллелить не представляется возможным, поскольку выбор очередной пары кластеров для сравнения зависит от результата выполнения предыдущей итерации, поэтому сложность оставляется равной &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует несколько последовательных реализаций алгоритма. С одной из них можно ознакомиться по ссылке [http://www.codeforge.com/article/192925].&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS [http://glaros.dtc.umn.edu/gkhome/metis/metis/overview] , hMETIS [http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview] и RANN [https://cran.r-project.org/web/packages/RANN/index.html].&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь [http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм выполняется в два этапа.&lt;br /&gt;
&lt;br /&gt;
На первом этапе CHAMELEON использует алгоритм разделения графа для получения набора относительно малых кластеров. На втором этапе, для объединения кластеров, полученных на первом этапе, в настоящие кластеры, используется иерархическая агломеративная кластеризация. Таким образом, алгоритм, фактически, является гибридным, построенным комбинацией графо-ориентированных и классических иерархических методов. Рассмотрим эти этапы подробнее.&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары. &lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|2000px|thumb|left|На рисунке изображены: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4)граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
Такое представление имеет целый ряд преимуществ.&lt;br /&gt;
&lt;br /&gt;
Во-первых, можно сразу убрать ребра в графе с достаточно малым весом (значением сходства).&lt;br /&gt;
&lt;br /&gt;
Во-вторых, возможно динамически определить для различных участков графа количество k ближайших соседей для вершин, на основе плотности данных отдельно взятого участка, которую, в свою очередь, можно определить на основе весов ребер.&lt;br /&gt;
&lt;br /&gt;
В-третьих, операции на графах (например, разделение графа), имеющих такое представление, выполняются гораздо быстрее, чем на полных графах.&lt;br /&gt;
&lt;br /&gt;
Обычно, k берется в пределах от 5 до 20 в зависимости от количества анализируемых объектов, и, как свидетельствуют авторы, выбор k почти не оказывает влияния на результаты кластеризации.&lt;br /&gt;
&lt;br /&gt;
Далее, алгоритм разделяет полученный граф на множество сравнительно малых подграфов. Разделение происходит последовательно. На каждом шаге выбирается под-граф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа, так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший под-граф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
На втором этапе, алгоритм последовательно объединяет кластеры, используя значение их относительной взаимной связности и относительного взаимного сходства. Только если оба эти значения достаточно высоки у двух кластеров, они объединяются.&lt;br /&gt;
&lt;br /&gt;
Относительная взаимная связность пары кластеров определяется абсолютной взаимной связностью кластеров, нормализованной с учетом внутренней связности (п. 0) каждого кластера (подграфа). Нормализация используется для того, чтобы исключить тенденцию к преимущественному объединению крупных кластеров, у которых, определенно, значение взаимной связности будет больше, вследствие их размера.&lt;br /&gt;
&lt;br /&gt;
Абсолютная взаимная связность между парой кластеров Ci и Сj определяется как сумма весов ребер, соединяющих вершины, принадлежащие Ci с вершинами из Сj. Эти ребра, фактически, входят в разделитель ребер графа, состоящего из кластеров Ci и Сj, и разбивающим его на подграфы Ci и Сj. Обозначается эта величина как  . Внутреннюю связность  кластера Ci можно вычислить как сумму ребер, входящих в разделитель ребер, разбивающий Ci на два совершенно равных подграфа.&lt;br /&gt;
&lt;br /&gt;
Относительная взаимная связность  пары кластеров Ci и Сj определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
Относительное взаимное сходство пары кластеров определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
Абсолютное взаимное сходство между парой кластеров Ci и Сj подсчитывается как среднее сходство между соединенными вершинами, принадлежащими Ci и Сj соответственно. Эти соединения обусловлены предыдущим (на первом этапе) разбиением общего графа, полученного на матрице сходства.&lt;br /&gt;
&lt;br /&gt;
Итак, относительное взаимное сходство  между парой кластеров Ci и Сj равно:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где  и  – средние веса ребер (значения сходства), принадлежащих разделителю ребер кластеров Ci и Сj соответственно, и  – средний вес ребер, соединяющих вершины Ci с вершинами Сj, причем ребра принадлежат разделителю ребер  , определенному ранее. Можно также подсчитать внутреннее сходство как среднее значение весов всех связей в кластере, однако использования разделителя ребер по мнению авторов метода предпочтительнее. Этот факт они связывают с тем, что связи между объектами, помещенными в один кластер на ранних этапах объединения, сильнее, чем на поздних.&lt;br /&gt;
&lt;br /&gt;
Далее, алгоритм применяет агломеративную иерархическую кластеризацию с использованием вышеозначенных показателей. Причем существует две стратегии их учета. Первая подразумевает наличие некоторых пороговых значений. T­RI и T­RC. В соответствии с этой стратегией, алгоритм для каждого кластера Ci проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер Сj, с которым у кластера Ci получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры T­RI и T­RC могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основное отличие данного подхода от классических агломеративных иерархических методов в том, что, во-первых, на каждом шаге могут быть объединены несколько кластеров, а, во-вторых, на каком-то этапе ни одна пара кластеров не будет удовлетворять вышеуказанным условиям и такое разбиение будет считаться оптимальным, то есть в конце может не получиться один всеохватывающий кластер. Если данное разбиение не удовлетворяет выбранным критериям, то пороговые значения можно уменьшить.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где a выбирается пользователем. Если a &amp;gt; 1, то алгоритм придает большее значение относительному взаимному сходству, а если a &amp;lt; 1, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа.&lt;br /&gt;
&lt;br /&gt;
Общая временная сложность этого алгоритма выражается как  , где n – количество анализируемых документов, m­ – количество получившихся после первого этапа малых кластеров.&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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9326</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9326"/>
		<updated>2016-10-15T11:45:26Z</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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]]( разделы 1.1 - 1.10), [[Участник:ShimchikN|Шимчик Никита Владимирович]]( разделы 1.1 - 1.10).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON - относительно новый алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|500px| На рисунке изображен принцип k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4)граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;
&lt;br /&gt;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&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;n&amp;lt;/math&amp;gt; процессами: в этом случае каждому процессу назначается своя точка и происходит поиск &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Таким образом, его параллельная сложность составляет O(n).&lt;br /&gt;
&lt;br /&gt;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап распараллелить не представляется возможным, поскольку выбор очередной пары кластеров для сравнения зависит от результата выполнения предыдущей итерации, поэтому сложность оставляется равной &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует несколько последовательных реализаций алгоритма. С одной из них можно ознакомиться по ссылке [http://www.codeforge.com/article/192925].&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS [http://glaros.dtc.umn.edu/gkhome/metis/metis/overview] , hMETIS [http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview] и RANN [https://cran.r-project.org/web/packages/RANN/index.html].&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь [http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм выполняется в два этапа.&lt;br /&gt;
&lt;br /&gt;
На первом этапе CHAMELEON использует алгоритм разделения графа для получения набора относительно малых кластеров. На втором этапе, для объединения кластеров, полученных на первом этапе, в настоящие кластеры, используется иерархическая агломеративная кластеризация. Таким образом, алгоритм, фактически, является гибридным, построенным комбинацией графо-ориентированных и классических иерархических методов. Рассмотрим эти этапы подробнее.&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары. &lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|2000px|thumb|left|На рисунке изображены: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4)граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
Такое представление имеет целый ряд преимуществ.&lt;br /&gt;
&lt;br /&gt;
Во-первых, можно сразу убрать ребра в графе с достаточно малым весом (значением сходства).&lt;br /&gt;
&lt;br /&gt;
Во-вторых, возможно динамически определить для различных участков графа количество k ближайших соседей для вершин, на основе плотности данных отдельно взятого участка, которую, в свою очередь, можно определить на основе весов ребер.&lt;br /&gt;
&lt;br /&gt;
В-третьих, операции на графах (например, разделение графа), имеющих такое представление, выполняются гораздо быстрее, чем на полных графах.&lt;br /&gt;
&lt;br /&gt;
Обычно, k берется в пределах от 5 до 20 в зависимости от количества анализируемых объектов, и, как свидетельствуют авторы, выбор k почти не оказывает влияния на результаты кластеризации.&lt;br /&gt;
&lt;br /&gt;
Далее, алгоритм разделяет полученный граф на множество сравнительно малых подграфов. Разделение происходит последовательно. На каждом шаге выбирается под-граф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа, так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший под-граф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
На втором этапе, алгоритм последовательно объединяет кластеры, используя значение их относительной взаимной связности и относительного взаимного сходства. Только если оба эти значения достаточно высоки у двух кластеров, они объединяются.&lt;br /&gt;
&lt;br /&gt;
Относительная взаимная связность пары кластеров определяется абсолютной взаимной связностью кластеров, нормализованной с учетом внутренней связности (п. 0) каждого кластера (подграфа). Нормализация используется для того, чтобы исключить тенденцию к преимущественному объединению крупных кластеров, у которых, определенно, значение взаимной связности будет больше, вследствие их размера.&lt;br /&gt;
&lt;br /&gt;
Абсолютная взаимная связность между парой кластеров Ci и Сj определяется как сумма весов ребер, соединяющих вершины, принадлежащие Ci с вершинами из Сj. Эти ребра, фактически, входят в разделитель ребер графа, состоящего из кластеров Ci и Сj, и разбивающим его на подграфы Ci и Сj. Обозначается эта величина как  . Внутреннюю связность  кластера Ci можно вычислить как сумму ребер, входящих в разделитель ребер, разбивающий Ci на два совершенно равных подграфа.&lt;br /&gt;
&lt;br /&gt;
Относительная взаимная связность  пары кластеров Ci и Сj определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
Относительное взаимное сходство пары кластеров определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
Абсолютное взаимное сходство между парой кластеров Ci и Сj подсчитывается как среднее сходство между соединенными вершинами, принадлежащими Ci и Сj соответственно. Эти соединения обусловлены предыдущим (на первом этапе) разбиением общего графа, полученного на матрице сходства.&lt;br /&gt;
&lt;br /&gt;
Итак, относительное взаимное сходство  между парой кластеров Ci и Сj равно:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где  и  – средние веса ребер (значения сходства), принадлежащих разделителю ребер кластеров Ci и Сj соответственно, и  – средний вес ребер, соединяющих вершины Ci с вершинами Сj, причем ребра принадлежат разделителю ребер  , определенному ранее. Можно также подсчитать внутреннее сходство как среднее значение весов всех связей в кластере, однако использования разделителя ребер по мнению авторов метода предпочтительнее. Этот факт они связывают с тем, что связи между объектами, помещенными в один кластер на ранних этапах объединения, сильнее, чем на поздних.&lt;br /&gt;
&lt;br /&gt;
Далее, алгоритм применяет агломеративную иерархическую кластеризацию с использованием вышеозначенных показателей. Причем существует две стратегии их учета. Первая подразумевает наличие некоторых пороговых значений. T­RI и T­RC. В соответствии с этой стратегией, алгоритм для каждого кластера Ci проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер Сj, с которым у кластера Ci получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры T­RI и T­RC могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основное отличие данного подхода от классических агломеративных иерархических методов в том, что, во-первых, на каждом шаге могут быть объединены несколько кластеров, а, во-вторых, на каком-то этапе ни одна пара кластеров не будет удовлетворять вышеуказанным условиям и такое разбиение будет считаться оптимальным, то есть в конце может не получиться один всеохватывающий кластер. Если данное разбиение не удовлетворяет выбранным критериям, то пороговые значения можно уменьшить.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где a выбирается пользователем. Если a &amp;gt; 1, то алгоритм придает большее значение относительному взаимному сходству, а если a &amp;lt; 1, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа.&lt;br /&gt;
&lt;br /&gt;
Общая временная сложность этого алгоритма выражается как  , где n – количество анализируемых документов, m­ – количество получившихся после первого этапа малых кластеров.&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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9325</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9325"/>
		<updated>2016-10-15T11:45:01Z</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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]]( разделы 1.1 - 1.10), [[Участник:ShimchikN|Шимчик Никита Владимирович]]( разделы 1.1 - 1.10).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON - относительно новый алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|2000px| На рисунке изображен принцип k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4)граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;
&lt;br /&gt;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&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;n&amp;lt;/math&amp;gt; процессами: в этом случае каждому процессу назначается своя точка и происходит поиск &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Таким образом, его параллельная сложность составляет O(n).&lt;br /&gt;
&lt;br /&gt;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап распараллелить не представляется возможным, поскольку выбор очередной пары кластеров для сравнения зависит от результата выполнения предыдущей итерации, поэтому сложность оставляется равной &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует несколько последовательных реализаций алгоритма. С одной из них можно ознакомиться по ссылке [http://www.codeforge.com/article/192925].&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS [http://glaros.dtc.umn.edu/gkhome/metis/metis/overview] , hMETIS [http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview] и RANN [https://cran.r-project.org/web/packages/RANN/index.html].&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь [http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм выполняется в два этапа.&lt;br /&gt;
&lt;br /&gt;
На первом этапе CHAMELEON использует алгоритм разделения графа для получения набора относительно малых кластеров. На втором этапе, для объединения кластеров, полученных на первом этапе, в настоящие кластеры, используется иерархическая агломеративная кластеризация. Таким образом, алгоритм, фактически, является гибридным, построенным комбинацией графо-ориентированных и классических иерархических методов. Рассмотрим эти этапы подробнее.&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары. &lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|2000px|thumb|left|На рисунке изображены: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4)граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
Такое представление имеет целый ряд преимуществ.&lt;br /&gt;
&lt;br /&gt;
Во-первых, можно сразу убрать ребра в графе с достаточно малым весом (значением сходства).&lt;br /&gt;
&lt;br /&gt;
Во-вторых, возможно динамически определить для различных участков графа количество k ближайших соседей для вершин, на основе плотности данных отдельно взятого участка, которую, в свою очередь, можно определить на основе весов ребер.&lt;br /&gt;
&lt;br /&gt;
В-третьих, операции на графах (например, разделение графа), имеющих такое представление, выполняются гораздо быстрее, чем на полных графах.&lt;br /&gt;
&lt;br /&gt;
Обычно, k берется в пределах от 5 до 20 в зависимости от количества анализируемых объектов, и, как свидетельствуют авторы, выбор k почти не оказывает влияния на результаты кластеризации.&lt;br /&gt;
&lt;br /&gt;
Далее, алгоритм разделяет полученный граф на множество сравнительно малых подграфов. Разделение происходит последовательно. На каждом шаге выбирается под-граф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа, так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший под-граф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
На втором этапе, алгоритм последовательно объединяет кластеры, используя значение их относительной взаимной связности и относительного взаимного сходства. Только если оба эти значения достаточно высоки у двух кластеров, они объединяются.&lt;br /&gt;
&lt;br /&gt;
Относительная взаимная связность пары кластеров определяется абсолютной взаимной связностью кластеров, нормализованной с учетом внутренней связности (п. 0) каждого кластера (подграфа). Нормализация используется для того, чтобы исключить тенденцию к преимущественному объединению крупных кластеров, у которых, определенно, значение взаимной связности будет больше, вследствие их размера.&lt;br /&gt;
&lt;br /&gt;
Абсолютная взаимная связность между парой кластеров Ci и Сj определяется как сумма весов ребер, соединяющих вершины, принадлежащие Ci с вершинами из Сj. Эти ребра, фактически, входят в разделитель ребер графа, состоящего из кластеров Ci и Сj, и разбивающим его на подграфы Ci и Сj. Обозначается эта величина как  . Внутреннюю связность  кластера Ci можно вычислить как сумму ребер, входящих в разделитель ребер, разбивающий Ci на два совершенно равных подграфа.&lt;br /&gt;
&lt;br /&gt;
Относительная взаимная связность  пары кластеров Ci и Сj определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
Относительное взаимное сходство пары кластеров определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
Абсолютное взаимное сходство между парой кластеров Ci и Сj подсчитывается как среднее сходство между соединенными вершинами, принадлежащими Ci и Сj соответственно. Эти соединения обусловлены предыдущим (на первом этапе) разбиением общего графа, полученного на матрице сходства.&lt;br /&gt;
&lt;br /&gt;
Итак, относительное взаимное сходство  между парой кластеров Ci и Сj равно:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где  и  – средние веса ребер (значения сходства), принадлежащих разделителю ребер кластеров Ci и Сj соответственно, и  – средний вес ребер, соединяющих вершины Ci с вершинами Сj, причем ребра принадлежат разделителю ребер  , определенному ранее. Можно также подсчитать внутреннее сходство как среднее значение весов всех связей в кластере, однако использования разделителя ребер по мнению авторов метода предпочтительнее. Этот факт они связывают с тем, что связи между объектами, помещенными в один кластер на ранних этапах объединения, сильнее, чем на поздних.&lt;br /&gt;
&lt;br /&gt;
Далее, алгоритм применяет агломеративную иерархическую кластеризацию с использованием вышеозначенных показателей. Причем существует две стратегии их учета. Первая подразумевает наличие некоторых пороговых значений. T­RI и T­RC. В соответствии с этой стратегией, алгоритм для каждого кластера Ci проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер Сj, с которым у кластера Ci получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры T­RI и T­RC могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основное отличие данного подхода от классических агломеративных иерархических методов в том, что, во-первых, на каждом шаге могут быть объединены несколько кластеров, а, во-вторых, на каком-то этапе ни одна пара кластеров не будет удовлетворять вышеуказанным условиям и такое разбиение будет считаться оптимальным, то есть в конце может не получиться один всеохватывающий кластер. Если данное разбиение не удовлетворяет выбранным критериям, то пороговые значения можно уменьшить.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где a выбирается пользователем. Если a &amp;gt; 1, то алгоритм придает большее значение относительному взаимному сходству, а если a &amp;lt; 1, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа.&lt;br /&gt;
&lt;br /&gt;
Общая временная сложность этого алгоритма выражается как  , где n – количество анализируемых документов, m­ – количество получившихся после первого этапа малых кластеров.&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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9323</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9323"/>
		<updated>2016-10-15T11:44:25Z</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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]]( разделы 1.1 - 1.10), [[Участник:ShimchikN|Шимчик Никита Владимирович]]( разделы 1.1 - 1.10).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON - относительно новый алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|2000px|thumb|left|На рисунке изображен принцип k ближайших соседей: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4)граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;
&lt;br /&gt;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&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;n&amp;lt;/math&amp;gt; процессами: в этом случае каждому процессу назначается своя точка и происходит поиск &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Таким образом, его параллельная сложность составляет O(n).&lt;br /&gt;
&lt;br /&gt;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап распараллелить не представляется возможным, поскольку выбор очередной пары кластеров для сравнения зависит от результата выполнения предыдущей итерации, поэтому сложность оставляется равной &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует несколько последовательных реализаций алгоритма. С одной из них можно ознакомиться по ссылке [http://www.codeforge.com/article/192925].&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS [http://glaros.dtc.umn.edu/gkhome/metis/metis/overview] , hMETIS [http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview] и RANN [https://cran.r-project.org/web/packages/RANN/index.html].&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь [http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм выполняется в два этапа.&lt;br /&gt;
&lt;br /&gt;
На первом этапе CHAMELEON использует алгоритм разделения графа для получения набора относительно малых кластеров. На втором этапе, для объединения кластеров, полученных на первом этапе, в настоящие кластеры, используется иерархическая агломеративная кластеризация. Таким образом, алгоритм, фактически, является гибридным, построенным комбинацией графо-ориентированных и классических иерархических методов. Рассмотрим эти этапы подробнее.&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары. &lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|2000px|thumb|left|На рисунке изображены: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4)граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
Такое представление имеет целый ряд преимуществ.&lt;br /&gt;
&lt;br /&gt;
Во-первых, можно сразу убрать ребра в графе с достаточно малым весом (значением сходства).&lt;br /&gt;
&lt;br /&gt;
Во-вторых, возможно динамически определить для различных участков графа количество k ближайших соседей для вершин, на основе плотности данных отдельно взятого участка, которую, в свою очередь, можно определить на основе весов ребер.&lt;br /&gt;
&lt;br /&gt;
В-третьих, операции на графах (например, разделение графа), имеющих такое представление, выполняются гораздо быстрее, чем на полных графах.&lt;br /&gt;
&lt;br /&gt;
Обычно, k берется в пределах от 5 до 20 в зависимости от количества анализируемых объектов, и, как свидетельствуют авторы, выбор k почти не оказывает влияния на результаты кластеризации.&lt;br /&gt;
&lt;br /&gt;
Далее, алгоритм разделяет полученный граф на множество сравнительно малых подграфов. Разделение происходит последовательно. На каждом шаге выбирается под-граф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа, так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший под-граф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
На втором этапе, алгоритм последовательно объединяет кластеры, используя значение их относительной взаимной связности и относительного взаимного сходства. Только если оба эти значения достаточно высоки у двух кластеров, они объединяются.&lt;br /&gt;
&lt;br /&gt;
Относительная взаимная связность пары кластеров определяется абсолютной взаимной связностью кластеров, нормализованной с учетом внутренней связности (п. 0) каждого кластера (подграфа). Нормализация используется для того, чтобы исключить тенденцию к преимущественному объединению крупных кластеров, у которых, определенно, значение взаимной связности будет больше, вследствие их размера.&lt;br /&gt;
&lt;br /&gt;
Абсолютная взаимная связность между парой кластеров Ci и Сj определяется как сумма весов ребер, соединяющих вершины, принадлежащие Ci с вершинами из Сj. Эти ребра, фактически, входят в разделитель ребер графа, состоящего из кластеров Ci и Сj, и разбивающим его на подграфы Ci и Сj. Обозначается эта величина как  . Внутреннюю связность  кластера Ci можно вычислить как сумму ребер, входящих в разделитель ребер, разбивающий Ci на два совершенно равных подграфа.&lt;br /&gt;
&lt;br /&gt;
Относительная взаимная связность  пары кластеров Ci и Сj определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
Относительное взаимное сходство пары кластеров определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
Абсолютное взаимное сходство между парой кластеров Ci и Сj подсчитывается как среднее сходство между соединенными вершинами, принадлежащими Ci и Сj соответственно. Эти соединения обусловлены предыдущим (на первом этапе) разбиением общего графа, полученного на матрице сходства.&lt;br /&gt;
&lt;br /&gt;
Итак, относительное взаимное сходство  между парой кластеров Ci и Сj равно:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где  и  – средние веса ребер (значения сходства), принадлежащих разделителю ребер кластеров Ci и Сj соответственно, и  – средний вес ребер, соединяющих вершины Ci с вершинами Сj, причем ребра принадлежат разделителю ребер  , определенному ранее. Можно также подсчитать внутреннее сходство как среднее значение весов всех связей в кластере, однако использования разделителя ребер по мнению авторов метода предпочтительнее. Этот факт они связывают с тем, что связи между объектами, помещенными в один кластер на ранних этапах объединения, сильнее, чем на поздних.&lt;br /&gt;
&lt;br /&gt;
Далее, алгоритм применяет агломеративную иерархическую кластеризацию с использованием вышеозначенных показателей. Причем существует две стратегии их учета. Первая подразумевает наличие некоторых пороговых значений. T­RI и T­RC. В соответствии с этой стратегией, алгоритм для каждого кластера Ci проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер Сj, с которым у кластера Ci получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры T­RI и T­RC могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основное отличие данного подхода от классических агломеративных иерархических методов в том, что, во-первых, на каждом шаге могут быть объединены несколько кластеров, а, во-вторых, на каком-то этапе ни одна пара кластеров не будет удовлетворять вышеуказанным условиям и такое разбиение будет считаться оптимальным, то есть в конце может не получиться один всеохватывающий кластер. Если данное разбиение не удовлетворяет выбранным критериям, то пороговые значения можно уменьшить.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где a выбирается пользователем. Если a &amp;gt; 1, то алгоритм придает большее значение относительному взаимному сходству, а если a &amp;lt; 1, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа.&lt;br /&gt;
&lt;br /&gt;
Общая временная сложность этого алгоритма выражается как  , где n – количество анализируемых документов, m­ – количество получившихся после первого этапа малых кластеров.&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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9318</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9318"/>
		<updated>2016-10-15T11:42:58Z</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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]]( разделы 1.1 - 1.10), [[Участник:ShimchikN|Шимчик Никита Владимирович]]( разделы 1.1 - 1.10).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON - относительно новый алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;
&lt;br /&gt;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
* Третий этап:&lt;br /&gt;
  [[File:Chameleon_stage_3.png|611px]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&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;n&amp;lt;/math&amp;gt; процессами: в этом случае каждому процессу назначается своя точка и происходит поиск &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Таким образом, его параллельная сложность составляет O(n).&lt;br /&gt;
&lt;br /&gt;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап распараллелить не представляется возможным, поскольку выбор очередной пары кластеров для сравнения зависит от результата выполнения предыдущей итерации, поэтому сложность оставляется равной &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует несколько последовательных реализаций алгоритма. С одной из них можно ознакомиться по ссылке [http://www.codeforge.com/article/192925].&lt;br /&gt;
&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS [http://glaros.dtc.umn.edu/gkhome/metis/metis/overview] , hMETIS [http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview] и RANN [https://cran.r-project.org/web/packages/RANN/index.html].&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь [http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм выполняется в два этапа.&lt;br /&gt;
&lt;br /&gt;
На первом этапе CHAMELEON использует алгоритм разделения графа для получения набора относительно малых кластеров. На втором этапе, для объединения кластеров, полученных на первом этапе, в настоящие кластеры, используется иерархическая агломеративная кластеризация. Таким образом, алгоритм, фактически, является гибридным, построенным комбинацией графо-ориентированных и классических иерархических методов. Рассмотрим эти этапы подробнее.&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары. &lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|2000px|thumb|left|На рисунке изображены: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4)граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
Такое представление имеет целый ряд преимуществ.&lt;br /&gt;
&lt;br /&gt;
Во-первых, можно сразу убрать ребра в графе с достаточно малым весом (значением сходства).&lt;br /&gt;
&lt;br /&gt;
Во-вторых, возможно динамически определить для различных участков графа количество k ближайших соседей для вершин, на основе плотности данных отдельно взятого участка, которую, в свою очередь, можно определить на основе весов ребер.&lt;br /&gt;
&lt;br /&gt;
В-третьих, операции на графах (например, разделение графа), имеющих такое представление, выполняются гораздо быстрее, чем на полных графах.&lt;br /&gt;
&lt;br /&gt;
Обычно, k берется в пределах от 5 до 20 в зависимости от количества анализируемых объектов, и, как свидетельствуют авторы, выбор k почти не оказывает влияния на результаты кластеризации.&lt;br /&gt;
&lt;br /&gt;
Далее, алгоритм разделяет полученный граф на множество сравнительно малых подграфов. Разделение происходит последовательно. На каждом шаге выбирается под-граф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа, так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший под-граф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
На втором этапе, алгоритм последовательно объединяет кластеры, используя значение их относительной взаимной связности и относительного взаимного сходства. Только если оба эти значения достаточно высоки у двух кластеров, они объединяются.&lt;br /&gt;
&lt;br /&gt;
Относительная взаимная связность пары кластеров определяется абсолютной взаимной связностью кластеров, нормализованной с учетом внутренней связности (п. 0) каждого кластера (подграфа). Нормализация используется для того, чтобы исключить тенденцию к преимущественному объединению крупных кластеров, у которых, определенно, значение взаимной связности будет больше, вследствие их размера.&lt;br /&gt;
&lt;br /&gt;
Абсолютная взаимная связность между парой кластеров Ci и Сj определяется как сумма весов ребер, соединяющих вершины, принадлежащие Ci с вершинами из Сj. Эти ребра, фактически, входят в разделитель ребер графа, состоящего из кластеров Ci и Сj, и разбивающим его на подграфы Ci и Сj. Обозначается эта величина как  . Внутреннюю связность  кластера Ci можно вычислить как сумму ребер, входящих в разделитель ребер, разбивающий Ci на два совершенно равных подграфа.&lt;br /&gt;
&lt;br /&gt;
Относительная взаимная связность  пары кластеров Ci и Сj определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
Относительное взаимное сходство пары кластеров определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
Абсолютное взаимное сходство между парой кластеров Ci и Сj подсчитывается как среднее сходство между соединенными вершинами, принадлежащими Ci и Сj соответственно. Эти соединения обусловлены предыдущим (на первом этапе) разбиением общего графа, полученного на матрице сходства.&lt;br /&gt;
&lt;br /&gt;
Итак, относительное взаимное сходство  между парой кластеров Ci и Сj равно:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где  и  – средние веса ребер (значения сходства), принадлежащих разделителю ребер кластеров Ci и Сj соответственно, и  – средний вес ребер, соединяющих вершины Ci с вершинами Сj, причем ребра принадлежат разделителю ребер  , определенному ранее. Можно также подсчитать внутреннее сходство как среднее значение весов всех связей в кластере, однако использования разделителя ребер по мнению авторов метода предпочтительнее. Этот факт они связывают с тем, что связи между объектами, помещенными в один кластер на ранних этапах объединения, сильнее, чем на поздних.&lt;br /&gt;
&lt;br /&gt;
Далее, алгоритм применяет агломеративную иерархическую кластеризацию с использованием вышеозначенных показателей. Причем существует две стратегии их учета. Первая подразумевает наличие некоторых пороговых значений. T­RI и T­RC. В соответствии с этой стратегией, алгоритм для каждого кластера Ci проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер Сj, с которым у кластера Ci получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры T­RI и T­RC могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основное отличие данного подхода от классических агломеративных иерархических методов в том, что, во-первых, на каждом шаге могут быть объединены несколько кластеров, а, во-вторых, на каком-то этапе ни одна пара кластеров не будет удовлетворять вышеуказанным условиям и такое разбиение будет считаться оптимальным, то есть в конце может не получиться один всеохватывающий кластер. Если данное разбиение не удовлетворяет выбранным критериям, то пороговые значения можно уменьшить.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где a выбирается пользователем. Если a &amp;gt; 1, то алгоритм придает большее значение относительному взаимному сходству, а если a &amp;lt; 1, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа.&lt;br /&gt;
&lt;br /&gt;
Общая временная сложность этого алгоритма выражается как  , где n – количество анализируемых документов, m­ – количество получившихся после первого этапа малых кластеров.&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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9133</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9133"/>
		<updated>2016-10-15T10:46:37Z</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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]]( разделы 1.1 - 1.10), [[Участник:ShimchikN|Шимчик Никита Владимирович]]( разделы 1.1 - 1.10).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON - относительно новый алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (C, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров K.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;
&lt;br /&gt;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&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;n&amp;lt;/math&amp;gt; процессами: в этом случае каждому процессу назначается своя точка и происходит поиск &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Таким образом, его параллельная сложность составляет O(n).&lt;br /&gt;
&lt;br /&gt;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап распараллелить не представляется возможным, поскольку выбор очередной пары кластеров для сравнения зависит от результата выполнения предыдущей итерации, поэтому сложность оставляется равной &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует несколько последовательных реализаций алгоритма. С одной из них можно ознакомиться по ссылке [http://www.codeforge.com/article/192925].&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS [http://glaros.dtc.umn.edu/gkhome/metis/metis/overview] , hMETIS [http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview] и RANN [https://cran.r-project.org/web/packages/RANN/index.html].&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь [http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм выполняется в два этапа.&lt;br /&gt;
&lt;br /&gt;
На первом этапе CHAMELEON использует алгоритм разделения графа для получения набора относительно малых кластеров. На втором этапе, для объединения кластеров, полученных на первом этапе, в настоящие кластеры, используется иерархическая агломеративная кластеризация. Таким образом, алгоритм, фактически, является гибридным, построенным комбинацией графо-ориентированных и классических иерархических методов. Рассмотрим эти этапы подробнее.&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары. &lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|2000px|thumb|left|На рисунке изображены: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4)граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
Такое представление имеет целый ряд преимуществ.&lt;br /&gt;
&lt;br /&gt;
Во-первых, можно сразу убрать ребра в графе с достаточно малым весом (значением сходства).&lt;br /&gt;
&lt;br /&gt;
Во-вторых, возможно динамически определить для различных участков графа количество k ближайших соседей для вершин, на основе плотности данных отдельно взятого участка, которую, в свою очередь, можно определить на основе весов ребер.&lt;br /&gt;
&lt;br /&gt;
В-третьих, операции на графах (например, разделение графа), имеющих такое представление, выполняются гораздо быстрее, чем на полных графах.&lt;br /&gt;
&lt;br /&gt;
Обычно, k берется в пределах от 5 до 20 в зависимости от количества анализируемых объектов, и, как свидетельствуют авторы, выбор k почти не оказывает влияния на результаты кластеризации.&lt;br /&gt;
&lt;br /&gt;
Далее, алгоритм разделяет полученный граф на множество сравнительно малых подграфов. Разделение происходит последовательно. На каждом шаге выбирается под-граф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа, так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший под-граф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
На втором этапе, алгоритм последовательно объединяет кластеры, используя значение их относительной взаимной связности и относительного взаимного сходства. Только если оба эти значения достаточно высоки у двух кластеров, они объединяются.&lt;br /&gt;
&lt;br /&gt;
Относительная взаимная связность пары кластеров определяется абсолютной взаимной связностью кластеров, нормализованной с учетом внутренней связности (п. 0) каждого кластера (подграфа). Нормализация используется для того, чтобы исключить тенденцию к преимущественному объединению крупных кластеров, у которых, определенно, значение взаимной связности будет больше, вследствие их размера.&lt;br /&gt;
&lt;br /&gt;
Абсолютная взаимная связность между парой кластеров Ci и Сj определяется как сумма весов ребер, соединяющих вершины, принадлежащие Ci с вершинами из Сj. Эти ребра, фактически, входят в разделитель ребер графа, состоящего из кластеров Ci и Сj, и разбивающим его на подграфы Ci и Сj. Обозначается эта величина как  . Внутреннюю связность  кластера Ci можно вычислить как сумму ребер, входящих в разделитель ребер, разбивающий Ci на два совершенно равных подграфа.&lt;br /&gt;
&lt;br /&gt;
Относительная взаимная связность  пары кластеров Ci и Сj определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
Относительное взаимное сходство пары кластеров определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
Абсолютное взаимное сходство между парой кластеров Ci и Сj подсчитывается как среднее сходство между соединенными вершинами, принадлежащими Ci и Сj соответственно. Эти соединения обусловлены предыдущим (на первом этапе) разбиением общего графа, полученного на матрице сходства.&lt;br /&gt;
&lt;br /&gt;
Итак, относительное взаимное сходство  между парой кластеров Ci и Сj равно:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где  и  – средние веса ребер (значения сходства), принадлежащих разделителю ребер кластеров Ci и Сj соответственно, и  – средний вес ребер, соединяющих вершины Ci с вершинами Сj, причем ребра принадлежат разделителю ребер  , определенному ранее. Можно также подсчитать внутреннее сходство как среднее значение весов всех связей в кластере, однако использования разделителя ребер по мнению авторов метода предпочтительнее. Этот факт они связывают с тем, что связи между объектами, помещенными в один кластер на ранних этапах объединения, сильнее, чем на поздних.&lt;br /&gt;
&lt;br /&gt;
Далее, алгоритм применяет агломеративную иерархическую кластеризацию с использованием вышеозначенных показателей. Причем существует две стратегии их учета. Первая подразумевает наличие некоторых пороговых значений. T­RI и T­RC. В соответствии с этой стратегией, алгоритм для каждого кластера Ci проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер Сj, с которым у кластера Ci получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры T­RI и T­RC могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основное отличие данного подхода от классических агломеративных иерархических методов в том, что, во-первых, на каждом шаге могут быть объединены несколько кластеров, а, во-вторых, на каком-то этапе ни одна пара кластеров не будет удовлетворять вышеуказанным условиям и такое разбиение будет считаться оптимальным, то есть в конце может не получиться один всеохватывающий кластер. Если данное разбиение не удовлетворяет выбранным критериям, то пороговые значения можно уменьшить.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где a выбирается пользователем. Если a &amp;gt; 1, то алгоритм придает большее значение относительному взаимному сходству, а если a &amp;lt; 1, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа.&lt;br /&gt;
&lt;br /&gt;
Общая временная сложность этого алгоритма выражается как  , где n – количество анализируемых документов, m­ – количество получившихся после первого этапа малых кластеров.&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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9130</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9130"/>
		<updated>2016-10-15T10:46: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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]]( разделы 1.1 - 1.10), [[Участник:ShimchikN|Шимчик Никита Владимирович]]( разделы 1.1 - 1.10).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON - относительно новый алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (C, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров K.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;
&lt;br /&gt;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&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;n&amp;lt;/math&amp;gt; процессами: в этом случае каждому процессу назначается своя точка и происходит поиск &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Таким образом, его параллельная сложность составляет O(n).&lt;br /&gt;
&lt;br /&gt;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап распараллелить не представляется возможным, поскольку выбор очередной пары кластеров для сравнения зависит от результата выполнения предыдущей итерации, поэтому сложность оставляется равной &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует несколько последовательных реализаций алгоритма. С одной из них можно ознакомиться по ссылке [http://www.codeforge.com/article/192925].&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS [http://glaros.dtc.umn.edu/gkhome/metis/metis/overview] , hMETIS [http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview] и RANN [https://cran.r-project.org/web/packages/RANN/index.html].&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь [http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
Данный алгоритм выполняется в два этапа.&lt;br /&gt;
&lt;br /&gt;
На первом этапе CHAMELEON использует алгоритм разделения графа для получения набора относительно малых кластеров. На втором этапе, для объединения кластеров, полученных на первом этапе, в настоящие кластеры, используется иерархическая агломеративная кластеризация. Таким образом, алгоритм, фактически, является гибридным, построенным комбинацией графо-ориентированных и классических иерархических методов. Рассмотрим эти этапы подробнее.&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары. &lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|2000px|thumb|left|На рисунке изображены: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4)граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
Такое представление имеет целый ряд преимуществ.&lt;br /&gt;
&lt;br /&gt;
Во-первых, можно сразу убрать ребра в графе с достаточно малым весом (значением сходства).&lt;br /&gt;
&lt;br /&gt;
Во-вторых, возможно динамически определить для различных участков графа количество k ближайших соседей для вершин, на основе плотности данных отдельно взятого участка, которую, в свою очередь, можно определить на основе весов ребер.&lt;br /&gt;
&lt;br /&gt;
В-третьих, операции на графах (например, разделение графа), имеющих такое представление, выполняются гораздо быстрее, чем на полных графах.&lt;br /&gt;
&lt;br /&gt;
Обычно, k берется в пределах от 5 до 20 в зависимости от количества анализируемых объектов, и, как свидетельствуют авторы, выбор k почти не оказывает влияния на результаты кластеризации.&lt;br /&gt;
&lt;br /&gt;
Далее, алгоритм разделяет полученный граф на множество сравнительно малых подграфов. Разделение происходит последовательно. На каждом шаге выбирается под-граф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа, так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший под-граф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
На втором этапе, алгоритм последовательно объединяет кластеры, используя значение их относительной взаимной связности и относительного взаимного сходства. Только если оба эти значения достаточно высоки у двух кластеров, они объединяются.&lt;br /&gt;
&lt;br /&gt;
Относительная взаимная связность пары кластеров определяется абсолютной взаимной связностью кластеров, нормализованной с учетом внутренней связности (п. 0) каждого кластера (подграфа). Нормализация используется для того, чтобы исключить тенденцию к преимущественному объединению крупных кластеров, у которых, определенно, значение взаимной связности будет больше, вследствие их размера.&lt;br /&gt;
&lt;br /&gt;
Абсолютная взаимная связность между парой кластеров Ci и Сj определяется как сумма весов ребер, соединяющих вершины, принадлежащие Ci с вершинами из Сj. Эти ребра, фактически, входят в разделитель ребер графа, состоящего из кластеров Ci и Сj, и разбивающим его на подграфы Ci и Сj. Обозначается эта величина как  . Внутреннюю связность  кластера Ci можно вычислить как сумму ребер, входящих в разделитель ребер, разбивающий Ci на два совершенно равных подграфа.&lt;br /&gt;
&lt;br /&gt;
Относительная взаимная связность  пары кластеров Ci и Сj определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
Относительное взаимное сходство пары кластеров определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
Абсолютное взаимное сходство между парой кластеров Ci и Сj подсчитывается как среднее сходство между соединенными вершинами, принадлежащими Ci и Сj соответственно. Эти соединения обусловлены предыдущим (на первом этапе) разбиением общего графа, полученного на матрице сходства.&lt;br /&gt;
&lt;br /&gt;
Итак, относительное взаимное сходство  между парой кластеров Ci и Сj равно:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где  и  – средние веса ребер (значения сходства), принадлежащих разделителю ребер кластеров Ci и Сj соответственно, и  – средний вес ребер, соединяющих вершины Ci с вершинами Сj, причем ребра принадлежат разделителю ребер  , определенному ранее. Можно также подсчитать внутреннее сходство как среднее значение весов всех связей в кластере, однако использования разделителя ребер по мнению авторов метода предпочтительнее. Этот факт они связывают с тем, что связи между объектами, помещенными в один кластер на ранних этапах объединения, сильнее, чем на поздних.&lt;br /&gt;
&lt;br /&gt;
Далее, алгоритм применяет агломеративную иерархическую кластеризацию с использованием вышеозначенных показателей. Причем существует две стратегии их учета. Первая подразумевает наличие некоторых пороговых значений. T­RI и T­RC. В соответствии с этой стратегией, алгоритм для каждого кластера Ci проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер Сj, с которым у кластера Ci получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры T­RI и T­RC могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основное отличие данного подхода от классических агломеративных иерархических методов в том, что, во-первых, на каждом шаге могут быть объединены несколько кластеров, а, во-вторых, на каком-то этапе ни одна пара кластеров не будет удовлетворять вышеуказанным условиям и такое разбиение будет считаться оптимальным, то есть в конце может не получиться один всеохватывающий кластер. Если данное разбиение не удовлетворяет выбранным критериям, то пороговые значения можно уменьшить.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где a выбирается пользователем. Если a &amp;gt; 1, то алгоритм придает большее значение относительному взаимному сходству, а если a &amp;lt; 1, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа.&lt;br /&gt;
&lt;br /&gt;
Общая временная сложность этого алгоритма выражается как  , где n – количество анализируемых документов, m­ – количество получившихся после первого этапа малых кластеров.&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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9108</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9108"/>
		<updated>2016-10-15T10:43: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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]]( разделы 1.1 - 1.10), [[Участник:ShimchikN|Шимчик Никита Владимирович]]( разделы 1.1 - 1.10).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON - относительно новый алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (C, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров K.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;
&lt;br /&gt;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&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;n&amp;lt;/math&amp;gt; процессами: в этом случае каждому процессу назначается своя точка и происходит поиск &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Таким образом, его параллельная сложность составляет O(n).&lt;br /&gt;
&lt;br /&gt;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап распараллелить не представляется возможным, поскольку выбор очередной пары кластеров для сравнения зависит от результата выполнения предыдущей итерации, поэтому сложность оставляется равной &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует несколько последовательных реализаций алгоритма. С одной из них можно ознакомиться по ссылке [http://www.codeforge.com/article/192925].&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS [http://glaros.dtc.umn.edu/gkhome/metis/metis/overview] , hMETIS [http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview] и RANN [https://cran.r-project.org/web/packages/RANN/index.html].&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь [http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм выполняется в два этапа.&lt;br /&gt;
&lt;br /&gt;
На первом этапе CHAMELEON использует алгоритм разделения графа для получения набора относительно малых кластеров. На втором этапе, для объединения кластеров, полученных на первом этапе, в настоящие кластеры, используется иерархическая агломеративная кластеризация. Таким образом, алгоритм, фактически, является гибридным, построенным комбинацией графо-ориентированных и классических иерархических методов. Рассмотрим эти этапы подробнее.&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары. &lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|2000px|thumb|left|На рисунке изображены: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4)граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
Такое представление имеет целый ряд преимуществ.&lt;br /&gt;
&lt;br /&gt;
Во-первых, можно сразу убрать ребра в графе с достаточно малым весом (значением сходства).&lt;br /&gt;
&lt;br /&gt;
Во-вторых, возможно динамически определить для различных участков графа количество k ближайших соседей для вершин, на основе плотности данных отдельно взятого участка, которую, в свою очередь, можно определить на основе весов ребер.&lt;br /&gt;
&lt;br /&gt;
В-третьих, операции на графах (например, разделение графа), имеющих такое представление, выполняются гораздо быстрее, чем на полных графах.&lt;br /&gt;
&lt;br /&gt;
Обычно, k берется в пределах от 5 до 20 в зависимости от количества анализируемых объектов, и, как свидетельствуют авторы, выбор k почти не оказывает влияния на результаты кластеризации.&lt;br /&gt;
&lt;br /&gt;
Далее, алгоритм разделяет полученный граф на множество сравнительно малых подграфов. Разделение происходит последовательно. На каждом шаге выбирается под-граф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа, так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший под-граф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
На втором этапе, алгоритм последовательно объединяет кластеры, используя значение их относительной взаимной связности и относительного взаимного сходства. Только если оба эти значения достаточно высоки у двух кластеров, они объединяются.&lt;br /&gt;
&lt;br /&gt;
Относительная взаимная связность пары кластеров определяется абсолютной взаимной связностью кластеров, нормализованной с учетом внутренней связности (п. 0) каждого кластера (подграфа). Нормализация используется для того, чтобы исключить тенденцию к преимущественному объединению крупных кластеров, у которых, определенно, значение взаимной связности будет больше, вследствие их размера.&lt;br /&gt;
&lt;br /&gt;
Абсолютная взаимная связность между парой кластеров Ci и Сj определяется как сумма весов ребер, соединяющих вершины, принадлежащие Ci с вершинами из Сj. Эти ребра, фактически, входят в разделитель ребер графа, состоящего из кластеров Ci и Сj, и разбивающим его на подграфы Ci и Сj. Обозначается эта величина как  . Внутреннюю связность  кластера Ci можно вычислить как сумму ребер, входящих в разделитель ребер, разбивающий Ci на два совершенно равных подграфа.&lt;br /&gt;
&lt;br /&gt;
Относительная взаимная связность  пары кластеров Ci и Сj определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
Относительное взаимное сходство пары кластеров определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
Абсолютное взаимное сходство между парой кластеров Ci и Сj подсчитывается как среднее сходство между соединенными вершинами, принадлежащими Ci и Сj соответственно. Эти соединения обусловлены предыдущим (на первом этапе) разбиением общего графа, полученного на матрице сходства.&lt;br /&gt;
&lt;br /&gt;
Итак, относительное взаимное сходство  между парой кластеров Ci и Сj равно:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где  и  – средние веса ребер (значения сходства), принадлежащих разделителю ребер кластеров Ci и Сj соответственно, и  – средний вес ребер, соединяющих вершины Ci с вершинами Сj, причем ребра принадлежат разделителю ребер  , определенному ранее. Можно также подсчитать внутреннее сходство как среднее значение весов всех связей в кластере, однако использования разделителя ребер по мнению авторов метода предпочтительнее. Этот факт они связывают с тем, что связи между объектами, помещенными в один кластер на ранних этапах объединения, сильнее, чем на поздних.&lt;br /&gt;
&lt;br /&gt;
Далее, алгоритм применяет агломеративную иерархическую кластеризацию с использованием вышеозначенных показателей. Причем существует две стратегии их учета. Первая подразумевает наличие некоторых пороговых значений. T­RI и T­RC. В соответствии с этой стратегией, алгоритм для каждого кластера Ci проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер Сj, с которым у кластера Ci получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры T­RI и T­RC могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основное отличие данного подхода от классических агломеративных иерархических методов в том, что, во-первых, на каждом шаге могут быть объединены несколько кластеров, а, во-вторых, на каком-то этапе ни одна пара кластеров не будет удовлетворять вышеуказанным условиям и такое разбиение будет считаться оптимальным, то есть в конце может не получиться один всеохватывающий кластер. Если данное разбиение не удовлетворяет выбранным критериям, то пороговые значения можно уменьшить.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где a выбирается пользователем. Если a &amp;gt; 1, то алгоритм придает большее значение относительному взаимному сходству, а если a &amp;lt; 1, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа.&lt;br /&gt;
&lt;br /&gt;
Общая временная сложность этого алгоритма выражается как  , где n – количество анализируемых документов, m­ – количество получившихся после первого этапа малых кластеров.&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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9104</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9104"/>
		<updated>2016-10-15T10:42:33Z</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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]]( разделы 1.1 - 1.10), [[Участник:ShimchikN|Шимчик Никита Владимирович]]( разделы 1.1 - 1.10).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON - относительно новый алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (C, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров K.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;
&lt;br /&gt;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&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;n&amp;lt;/math&amp;gt; процессами: в этом случае каждому процессу назначается своя точка и происходит поиск &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Таким образом, его параллельная сложность составляет O(n).&lt;br /&gt;
&lt;br /&gt;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап распараллелить не представляется возможным, поскольку выбор очередной пары кластеров для сравнения зависит от результата выполнения предыдущей итерации, поэтому сложность оставляется равной &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует несколько последовательных реализаций алгоритма. С одной из них можно ознакомиться по ссылке [http://www.codeforge.com/article/192925].&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS [http://glaros.dtc.umn.edu/gkhome/metis/metis/overview|] , hMETIS [http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview|] и RANN [https://cran.r-project.org/web/packages/RANN/index.html|].&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь [http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf|].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм выполняется в два этапа.&lt;br /&gt;
&lt;br /&gt;
На первом этапе CHAMELEON использует алгоритм разделения графа для получения набора относительно малых кластеров. На втором этапе, для объединения кластеров, полученных на первом этапе, в настоящие кластеры, используется иерархическая агломеративная кластеризация. Таким образом, алгоритм, фактически, является гибридным, построенным комбинацией графо-ориентированных и классических иерархических методов. Рассмотрим эти этапы подробнее.&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары. &lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|2000px|thumb|left|На рисунке изображены: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4)граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
Такое представление имеет целый ряд преимуществ.&lt;br /&gt;
&lt;br /&gt;
Во-первых, можно сразу убрать ребра в графе с достаточно малым весом (значением сходства).&lt;br /&gt;
&lt;br /&gt;
Во-вторых, возможно динамически определить для различных участков графа количество k ближайших соседей для вершин, на основе плотности данных отдельно взятого участка, которую, в свою очередь, можно определить на основе весов ребер.&lt;br /&gt;
&lt;br /&gt;
В-третьих, операции на графах (например, разделение графа), имеющих такое представление, выполняются гораздо быстрее, чем на полных графах.&lt;br /&gt;
&lt;br /&gt;
Обычно, k берется в пределах от 5 до 20 в зависимости от количества анализируемых объектов, и, как свидетельствуют авторы, выбор k почти не оказывает влияния на результаты кластеризации.&lt;br /&gt;
&lt;br /&gt;
Далее, алгоритм разделяет полученный граф на множество сравнительно малых подграфов. Разделение происходит последовательно. На каждом шаге выбирается под-граф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа, так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший под-граф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
На втором этапе, алгоритм последовательно объединяет кластеры, используя значение их относительной взаимной связности и относительного взаимного сходства. Только если оба эти значения достаточно высоки у двух кластеров, они объединяются.&lt;br /&gt;
&lt;br /&gt;
Относительная взаимная связность пары кластеров определяется абсолютной взаимной связностью кластеров, нормализованной с учетом внутренней связности (п. 0) каждого кластера (подграфа). Нормализация используется для того, чтобы исключить тенденцию к преимущественному объединению крупных кластеров, у которых, определенно, значение взаимной связности будет больше, вследствие их размера.&lt;br /&gt;
&lt;br /&gt;
Абсолютная взаимная связность между парой кластеров Ci и Сj определяется как сумма весов ребер, соединяющих вершины, принадлежащие Ci с вершинами из Сj. Эти ребра, фактически, входят в разделитель ребер графа, состоящего из кластеров Ci и Сj, и разбивающим его на подграфы Ci и Сj. Обозначается эта величина как  . Внутреннюю связность  кластера Ci можно вычислить как сумму ребер, входящих в разделитель ребер, разбивающий Ci на два совершенно равных подграфа.&lt;br /&gt;
&lt;br /&gt;
Относительная взаимная связность  пары кластеров Ci и Сj определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
Относительное взаимное сходство пары кластеров определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
Абсолютное взаимное сходство между парой кластеров Ci и Сj подсчитывается как среднее сходство между соединенными вершинами, принадлежащими Ci и Сj соответственно. Эти соединения обусловлены предыдущим (на первом этапе) разбиением общего графа, полученного на матрице сходства.&lt;br /&gt;
&lt;br /&gt;
Итак, относительное взаимное сходство  между парой кластеров Ci и Сj равно:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где  и  – средние веса ребер (значения сходства), принадлежащих разделителю ребер кластеров Ci и Сj соответственно, и  – средний вес ребер, соединяющих вершины Ci с вершинами Сj, причем ребра принадлежат разделителю ребер  , определенному ранее. Можно также подсчитать внутреннее сходство как среднее значение весов всех связей в кластере, однако использования разделителя ребер по мнению авторов метода предпочтительнее. Этот факт они связывают с тем, что связи между объектами, помещенными в один кластер на ранних этапах объединения, сильнее, чем на поздних.&lt;br /&gt;
&lt;br /&gt;
Далее, алгоритм применяет агломеративную иерархическую кластеризацию с использованием вышеозначенных показателей. Причем существует две стратегии их учета. Первая подразумевает наличие некоторых пороговых значений. T­RI и T­RC. В соответствии с этой стратегией, алгоритм для каждого кластера Ci проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер Сj, с которым у кластера Ci получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры T­RI и T­RC могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основное отличие данного подхода от классических агломеративных иерархических методов в том, что, во-первых, на каждом шаге могут быть объединены несколько кластеров, а, во-вторых, на каком-то этапе ни одна пара кластеров не будет удовлетворять вышеуказанным условиям и такое разбиение будет считаться оптимальным, то есть в конце может не получиться один всеохватывающий кластер. Если данное разбиение не удовлетворяет выбранным критериям, то пороговые значения можно уменьшить.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где a выбирается пользователем. Если a &amp;gt; 1, то алгоритм придает большее значение относительному взаимному сходству, а если a &amp;lt; 1, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа.&lt;br /&gt;
&lt;br /&gt;
Общая временная сложность этого алгоритма выражается как  , где n – количество анализируемых документов, m­ – количество получившихся после первого этапа малых кластеров.&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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9098</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9098"/>
		<updated>2016-10-15T10:41: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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]]( разделы 1.1 - 1.10), [[Участник:ShimchikN|Шимчик Никита Владимирович]]( разделы 1.1 - 1.10).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON - относительно новый алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (C, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров K.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;
&lt;br /&gt;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&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;n&amp;lt;/math&amp;gt; процессами: в этом случае каждому процессу назначается своя точка и происходит поиск &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Таким образом, его параллельная сложность составляет O(n).&lt;br /&gt;
&lt;br /&gt;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап распараллелить не представляется возможным, поскольку выбор очередной пары кластеров для сравнения зависит от результата выполнения предыдущей итерации, поэтому сложность оставляется равной &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует несколько последовательных реализаций алгоритма. С одной из них можно ознакомиться по ссылке [http://www.codeforge.com/article/192925|].&lt;br /&gt;
Возможна реализация алгоритма CHAMELEON с использованием графовых библиотек, как, например METIS [http://glaros.dtc.umn.edu/gkhome/metis/metis/overview|] , hMETIS [http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview|] и RANN [https://cran.r-project.org/web/packages/RANN/index.html|].&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON найдено не было. Однако существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь [http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf|].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм выполняется в два этапа.&lt;br /&gt;
&lt;br /&gt;
На первом этапе CHAMELEON использует алгоритм разделения графа для получения набора относительно малых кластеров. На втором этапе, для объединения кластеров, полученных на первом этапе, в настоящие кластеры, используется иерархическая агломеративная кластеризация. Таким образом, алгоритм, фактически, является гибридным, построенным комбинацией графо-ориентированных и классических иерархических методов. Рассмотрим эти этапы подробнее.&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары. &lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|2000px|thumb|left|На рисунке изображены: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4)граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
Такое представление имеет целый ряд преимуществ.&lt;br /&gt;
&lt;br /&gt;
Во-первых, можно сразу убрать ребра в графе с достаточно малым весом (значением сходства).&lt;br /&gt;
&lt;br /&gt;
Во-вторых, возможно динамически определить для различных участков графа количество k ближайших соседей для вершин, на основе плотности данных отдельно взятого участка, которую, в свою очередь, можно определить на основе весов ребер.&lt;br /&gt;
&lt;br /&gt;
В-третьих, операции на графах (например, разделение графа), имеющих такое представление, выполняются гораздо быстрее, чем на полных графах.&lt;br /&gt;
&lt;br /&gt;
Обычно, k берется в пределах от 5 до 20 в зависимости от количества анализируемых объектов, и, как свидетельствуют авторы, выбор k почти не оказывает влияния на результаты кластеризации.&lt;br /&gt;
&lt;br /&gt;
Далее, алгоритм разделяет полученный граф на множество сравнительно малых подграфов. Разделение происходит последовательно. На каждом шаге выбирается под-граф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа, так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший под-граф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
На втором этапе, алгоритм последовательно объединяет кластеры, используя значение их относительной взаимной связности и относительного взаимного сходства. Только если оба эти значения достаточно высоки у двух кластеров, они объединяются.&lt;br /&gt;
&lt;br /&gt;
Относительная взаимная связность пары кластеров определяется абсолютной взаимной связностью кластеров, нормализованной с учетом внутренней связности (п. 0) каждого кластера (подграфа). Нормализация используется для того, чтобы исключить тенденцию к преимущественному объединению крупных кластеров, у которых, определенно, значение взаимной связности будет больше, вследствие их размера.&lt;br /&gt;
&lt;br /&gt;
Абсолютная взаимная связность между парой кластеров Ci и Сj определяется как сумма весов ребер, соединяющих вершины, принадлежащие Ci с вершинами из Сj. Эти ребра, фактически, входят в разделитель ребер графа, состоящего из кластеров Ci и Сj, и разбивающим его на подграфы Ci и Сj. Обозначается эта величина как  . Внутреннюю связность  кластера Ci можно вычислить как сумму ребер, входящих в разделитель ребер, разбивающий Ci на два совершенно равных подграфа.&lt;br /&gt;
&lt;br /&gt;
Относительная взаимная связность  пары кластеров Ci и Сj определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
Относительное взаимное сходство пары кластеров определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
Абсолютное взаимное сходство между парой кластеров Ci и Сj подсчитывается как среднее сходство между соединенными вершинами, принадлежащими Ci и Сj соответственно. Эти соединения обусловлены предыдущим (на первом этапе) разбиением общего графа, полученного на матрице сходства.&lt;br /&gt;
&lt;br /&gt;
Итак, относительное взаимное сходство  между парой кластеров Ci и Сj равно:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где  и  – средние веса ребер (значения сходства), принадлежащих разделителю ребер кластеров Ci и Сj соответственно, и  – средний вес ребер, соединяющих вершины Ci с вершинами Сj, причем ребра принадлежат разделителю ребер  , определенному ранее. Можно также подсчитать внутреннее сходство как среднее значение весов всех связей в кластере, однако использования разделителя ребер по мнению авторов метода предпочтительнее. Этот факт они связывают с тем, что связи между объектами, помещенными в один кластер на ранних этапах объединения, сильнее, чем на поздних.&lt;br /&gt;
&lt;br /&gt;
Далее, алгоритм применяет агломеративную иерархическую кластеризацию с использованием вышеозначенных показателей. Причем существует две стратегии их учета. Первая подразумевает наличие некоторых пороговых значений. T­RI и T­RC. В соответствии с этой стратегией, алгоритм для каждого кластера Ci проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер Сj, с которым у кластера Ci получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры T­RI и T­RC могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основное отличие данного подхода от классических агломеративных иерархических методов в том, что, во-первых, на каждом шаге могут быть объединены несколько кластеров, а, во-вторых, на каком-то этапе ни одна пара кластеров не будет удовлетворять вышеуказанным условиям и такое разбиение будет считаться оптимальным, то есть в конце может не получиться один всеохватывающий кластер. Если данное разбиение не удовлетворяет выбранным критериям, то пороговые значения можно уменьшить.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где a выбирается пользователем. Если a &amp;gt; 1, то алгоритм придает большее значение относительному взаимному сходству, а если a &amp;lt; 1, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа.&lt;br /&gt;
&lt;br /&gt;
Общая временная сложность этого алгоритма выражается как  , где n – количество анализируемых документов, m­ – количество получившихся после первого этапа малых кластеров.&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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9049</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9049"/>
		<updated>2016-10-15T10:33:57Z</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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]]( разделы 1.1 - 1.10), [[Участник:ShimchikN|Шимчик Никита Владимирович]]( разделы 1.1 - 1.10).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON - относительно новый алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (C, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров K.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;
&lt;br /&gt;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на первом этапе является процедура выделения k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&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;n&amp;lt;/math&amp;gt; процессами: в этом случае каждому процессу назначается своя точка и происходит поиск &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Таким образом, его параллельная сложность составляет O(n).&lt;br /&gt;
&lt;br /&gt;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап распараллелить не представляется возможным, поскольку выбор очередной пары кластеров для сравнения зависит от результата выполнения предыдущей итерации, поэтому сложность оставляется равной &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм выполняется в два этапа.&lt;br /&gt;
&lt;br /&gt;
На первом этапе CHAMELEON использует алгоритм разделения графа для получения набора относительно малых кластеров. На втором этапе, для объединения кластеров, полученных на первом этапе, в настоящие кластеры, используется иерархическая агломеративная кластеризация. Таким образом, алгоритм, фактически, является гибридным, построенным комбинацией графо-ориентированных и классических иерархических методов. Рассмотрим эти этапы подробнее.&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары. &lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|2000px|thumb|left|На рисунке изображены: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4)граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
Такое представление имеет целый ряд преимуществ.&lt;br /&gt;
&lt;br /&gt;
Во-первых, можно сразу убрать ребра в графе с достаточно малым весом (значением сходства).&lt;br /&gt;
&lt;br /&gt;
Во-вторых, возможно динамически определить для различных участков графа количество k ближайших соседей для вершин, на основе плотности данных отдельно взятого участка, которую, в свою очередь, можно определить на основе весов ребер.&lt;br /&gt;
&lt;br /&gt;
В-третьих, операции на графах (например, разделение графа), имеющих такое представление, выполняются гораздо быстрее, чем на полных графах.&lt;br /&gt;
&lt;br /&gt;
Обычно, k берется в пределах от 5 до 20 в зависимости от количества анализируемых объектов, и, как свидетельствуют авторы, выбор k почти не оказывает влияния на результаты кластеризации.&lt;br /&gt;
&lt;br /&gt;
Далее, алгоритм разделяет полученный граф на множество сравнительно малых подграфов. Разделение происходит последовательно. На каждом шаге выбирается под-граф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа, так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший под-граф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
На втором этапе, алгоритм последовательно объединяет кластеры, используя значение их относительной взаимной связности и относительного взаимного сходства. Только если оба эти значения достаточно высоки у двух кластеров, они объединяются.&lt;br /&gt;
&lt;br /&gt;
Относительная взаимная связность пары кластеров определяется абсолютной взаимной связностью кластеров, нормализованной с учетом внутренней связности (п. 0) каждого кластера (подграфа). Нормализация используется для того, чтобы исключить тенденцию к преимущественному объединению крупных кластеров, у которых, определенно, значение взаимной связности будет больше, вследствие их размера.&lt;br /&gt;
&lt;br /&gt;
Абсолютная взаимная связность между парой кластеров Ci и Сj определяется как сумма весов ребер, соединяющих вершины, принадлежащие Ci с вершинами из Сj. Эти ребра, фактически, входят в разделитель ребер графа, состоящего из кластеров Ci и Сj, и разбивающим его на подграфы Ci и Сj. Обозначается эта величина как  . Внутреннюю связность  кластера Ci можно вычислить как сумму ребер, входящих в разделитель ребер, разбивающий Ci на два совершенно равных подграфа.&lt;br /&gt;
&lt;br /&gt;
Относительная взаимная связность  пары кластеров Ci и Сj определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
Относительное взаимное сходство пары кластеров определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
Абсолютное взаимное сходство между парой кластеров Ci и Сj подсчитывается как среднее сходство между соединенными вершинами, принадлежащими Ci и Сj соответственно. Эти соединения обусловлены предыдущим (на первом этапе) разбиением общего графа, полученного на матрице сходства.&lt;br /&gt;
&lt;br /&gt;
Итак, относительное взаимное сходство  между парой кластеров Ci и Сj равно:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где  и  – средние веса ребер (значения сходства), принадлежащих разделителю ребер кластеров Ci и Сj соответственно, и  – средний вес ребер, соединяющих вершины Ci с вершинами Сj, причем ребра принадлежат разделителю ребер  , определенному ранее. Можно также подсчитать внутреннее сходство как среднее значение весов всех связей в кластере, однако использования разделителя ребер по мнению авторов метода предпочтительнее. Этот факт они связывают с тем, что связи между объектами, помещенными в один кластер на ранних этапах объединения, сильнее, чем на поздних.&lt;br /&gt;
&lt;br /&gt;
Далее, алгоритм применяет агломеративную иерархическую кластеризацию с использованием вышеозначенных показателей. Причем существует две стратегии их учета. Первая подразумевает наличие некоторых пороговых значений. T­RI и T­RC. В соответствии с этой стратегией, алгоритм для каждого кластера Ci проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер Сj, с которым у кластера Ci получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры T­RI и T­RC могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основное отличие данного подхода от классических агломеративных иерархических методов в том, что, во-первых, на каждом шаге могут быть объединены несколько кластеров, а, во-вторых, на каком-то этапе ни одна пара кластеров не будет удовлетворять вышеуказанным условиям и такое разбиение будет считаться оптимальным, то есть в конце может не получиться один всеохватывающий кластер. Если данное разбиение не удовлетворяет выбранным критериям, то пороговые значения можно уменьшить.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где a выбирается пользователем. Если a &amp;gt; 1, то алгоритм придает большее значение относительному взаимному сходству, а если a &amp;lt; 1, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа.&lt;br /&gt;
&lt;br /&gt;
Общая временная сложность этого алгоритма выражается как  , где n – количество анализируемых документов, m­ – количество получившихся после первого этапа малых кластеров.&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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9033</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%90%D1%80%D1%82%D0%B5%D0%BC_%D0%A2%D0%B0%D1%80%D0%B0%D0%BD/%D0%93%D1%80%D0%B0%D1%84%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=9033"/>
		<updated>2016-10-15T10:29:59Z</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(n^2+nm+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n + log(n) + m^2log(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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]]( разделы 1.1 - 1.10), [[Участник:ShimchikN|Шимчик Никита Владимирович]]( разделы 1.1 - 1.10).&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы (кластеры) с минимизацией межкластерного сходства и максимизацией внутрикластерного сходства.&lt;br /&gt;
&lt;br /&gt;
Графо-ориентированный алгоритм кластеризации CHAMELEON - относительно новый алгоритм, который измеряет сходство двух кластеров на основе&lt;br /&gt;
динамической модели. В процессе кластеризации два кластера объединяются, только если показатели взаимосвязанности и близости между двумя кластерами являются высокими по отношению к показателям внутренней взаимосвязанности кластеров и близости элементов внутри этих кластеров. Процесс слияния с использованием динамической модели, использующийся в данном алгоритме облегчает открытие&lt;br /&gt;
природных и однородных кластеров. Методология динамического моделирования кластеров, использующаяся в CHAMELEON,&lt;br /&gt;
применима ко всем типам данных, для которых может быть построена матрица подобия.&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации CHAMELEON включает в себя три этапа:&lt;br /&gt;
&lt;br /&gt;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Данные ====&lt;br /&gt;
* &#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; точек &amp;lt;math&amp;gt;V = \{v_{i}\}&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;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после первого этапа&#039;&#039;&#039;: граф &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;
* &#039;&#039;&#039;Промежуточный результат после второго этапа&#039;&#039;&#039;: разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; попарно непересекающихся связных подмножеств, из которого образуется взвешенный граф &amp;lt;math&amp;gt;G_{2} = (C, E_{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров &amp;lt;math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;), показывающий отображение исходного множества точек на набор кластеров K.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютная взаимная связность между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;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;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;
&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Внутреннюю связность &amp;lt;math&amp;gt;EC_{C_{i}}&amp;lt;/math&amp;gt; кластера &amp;lt;math&amp;gt;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;
* &#039;&#039;Относительная взаимная &amp;lt;math&amp;gt;RI_{(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;&#039;&#039; определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{2*|EC_{(C_{i},C_{j})}|}{|EC_{C_{i}}|+|EC_{C_{j}}|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Абсолютное взаимное сходство между парой кластеров &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&#039;&#039; подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &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;
* &#039;&#039;Относительное взаимное сходство &amp;lt;math&amp;gt;RC_{(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;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства и вычисляется по формуле:&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;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S_{EC_{(C_{i})}}&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;
и &amp;lt;math&amp;gt;S_{EC_{(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;, причем ребра принадлежат разделителю ребер &amp;lt;math&amp;gt;EC_{(C_{i})}&amp;lt;/math&amp;gt;, определенному ранее.&lt;br /&gt;
&lt;br /&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;
&lt;br /&gt;
На первом этапе работы алгоритма вычислительным ядром можно считать процесс нахождения k ближайших соседей для каждой отдельной вершины.&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;RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для пары смежных кластеров, а также их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм CHAMELEON выполняется в 3 этапа, последовательных относительно друг друга. Каждый этап соответствует отдельному алгоритму. &lt;br /&gt;
&lt;br /&gt;
* Макрооперацией на втором этапе является процедура разбиения наибольшего подграфа на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
* Макрооперациями на третьем этапе являются процедуры вычисления метрики для принятия решения об объединении кластеров и объединение кластеров на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Первый этап (псевдокод):&lt;br /&gt;
  integer n; // Количество точек.&lt;br /&gt;
  integer k; // Параметр k&lt;br /&gt;
  integer A[n][n]; // Верхняя треугольная матрица расстояний между точками.&lt;br /&gt;
  &lt;br /&gt;
  integer E[n][n]; // Верхняя треугольная матрица рёбер графа G - изначально инициализирована нулями.&lt;br /&gt;
  foreach (integer i in (1,n-1) ) {&lt;br /&gt;
    integer Neighbors[k]; // матрица, используемая хранения ближайших соседей&lt;br /&gt;
    integer countN = 0;&lt;br /&gt;
    &lt;br /&gt;
    foreach (integer j in (i+1, n) ) {&lt;br /&gt;
      // Заполняем матрицу Neighbors, добавляя новые элементы и увеличивая счётчик countN.&lt;br /&gt;
      // Когда countN станет равен k, новые элементы будут вставляться на место старых, либо отбрасываться.&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    foreach (integer j in (0, countN) ) {&lt;br /&gt;
      E[min(i,j), max(i,j)] = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return E;&lt;br /&gt;
&lt;br /&gt;
* Второй этап:&lt;br /&gt;
  [[File:Диаграмма_шаг_2.png]]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
1) Построение графа на основе метода k ближайших соседей в худшем случае требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&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;
Итого, получаем последовательную сложность &amp;lt;math&amp;gt;O(n^2+nm+m^2log(m))&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;n&amp;lt;/math&amp;gt; процессами: в этом случае каждому процессу назначается своя точка и происходит поиск &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Таким образом, его параллельная сложность составляет O(n).&lt;br /&gt;
&lt;br /&gt;
На втором этапе количество задействованных процессов может варьироваться в зависимости от входных данных. В худшем случае число итераций можно оценить как &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап распараллелить не представляется возможным, поскольку выбор очередной пары кластеров для сравнения зависит от результата выполнения предыдущей итерации, поэтому сложность оставляется равной &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, суммарная параллельная сложность оказывается равна &amp;lt;math&amp;gt;O(n + log(n) + m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: &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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&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) Наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&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;
* Выходные данные: n-мерный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&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;
&lt;br /&gt;
Первый этап алгоритма обладает хорошим ресурсом параллелизма: параллельная сложность его выполнения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, что намного лучше последовательной оценки &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм выполняется в два этапа.&lt;br /&gt;
&lt;br /&gt;
На первом этапе CHAMELEON использует алгоритм разделения графа для получения набора относительно малых кластеров. На втором этапе, для объединения кластеров, полученных на первом этапе, в настоящие кластеры, используется иерархическая агломеративная кластеризация. Таким образом, алгоритм, фактически, является гибридным, построенным комбинацией графо-ориентированных и классических иерархических методов. Рассмотрим эти этапы подробнее.&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары. &lt;br /&gt;
[[Файл:Графы k ближайших соседей.jpg|2000px|thumb|left|На рисунке изображены: 1) объекты в пространстве, 2) граф по принципу 1-го ближайшего соседа, 3) граф по принципу 2-го ближайшего соседа, 4)граф по принципу 3-х ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
Такое представление имеет целый ряд преимуществ.&lt;br /&gt;
&lt;br /&gt;
Во-первых, можно сразу убрать ребра в графе с достаточно малым весом (значением сходства).&lt;br /&gt;
&lt;br /&gt;
Во-вторых, возможно динамически определить для различных участков графа количество k ближайших соседей для вершин, на основе плотности данных отдельно взятого участка, которую, в свою очередь, можно определить на основе весов ребер.&lt;br /&gt;
&lt;br /&gt;
В-третьих, операции на графах (например, разделение графа), имеющих такое представление, выполняются гораздо быстрее, чем на полных графах.&lt;br /&gt;
&lt;br /&gt;
Обычно, k берется в пределах от 5 до 20 в зависимости от количества анализируемых объектов, и, как свидетельствуют авторы, выбор k почти не оказывает влияния на результаты кластеризации.&lt;br /&gt;
&lt;br /&gt;
Далее, алгоритм разделяет полученный граф на множество сравнительно малых подграфов. Разделение происходит последовательно. На каждом шаге выбирается под-граф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа, так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший под-граф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
На втором этапе, алгоритм последовательно объединяет кластеры, используя значение их относительной взаимной связности и относительного взаимного сходства. Только если оба эти значения достаточно высоки у двух кластеров, они объединяются.&lt;br /&gt;
&lt;br /&gt;
Относительная взаимная связность пары кластеров определяется абсолютной взаимной связностью кластеров, нормализованной с учетом внутренней связности (п. 0) каждого кластера (подграфа). Нормализация используется для того, чтобы исключить тенденцию к преимущественному объединению крупных кластеров, у которых, определенно, значение взаимной связности будет больше, вследствие их размера.&lt;br /&gt;
&lt;br /&gt;
Абсолютная взаимная связность между парой кластеров Ci и Сj определяется как сумма весов ребер, соединяющих вершины, принадлежащие Ci с вершинами из Сj. Эти ребра, фактически, входят в разделитель ребер графа, состоящего из кластеров Ci и Сj, и разбивающим его на подграфы Ci и Сj. Обозначается эта величина как  . Внутреннюю связность  кластера Ci можно вычислить как сумму ребер, входящих в разделитель ребер, разбивающий Ci на два совершенно равных подграфа.&lt;br /&gt;
&lt;br /&gt;
Относительная взаимная связность  пары кластеров Ci и Сj определяется формулой:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Учитывая значения относительной взаимной связности, можно добиться получения кластеров разного размера, формы и плотности, то есть общего внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
Относительное взаимное сходство пары кластеров определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
Абсолютное взаимное сходство между парой кластеров Ci и Сj подсчитывается как среднее сходство между соединенными вершинами, принадлежащими Ci и Сj соответственно. Эти соединения обусловлены предыдущим (на первом этапе) разбиением общего графа, полученного на матрице сходства.&lt;br /&gt;
&lt;br /&gt;
Итак, относительное взаимное сходство  между парой кластеров Ci и Сj равно:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где  и  – средние веса ребер (значения сходства), принадлежащих разделителю ребер кластеров Ci и Сj соответственно, и  – средний вес ребер, соединяющих вершины Ci с вершинами Сj, причем ребра принадлежат разделителю ребер  , определенному ранее. Можно также подсчитать внутреннее сходство как среднее значение весов всех связей в кластере, однако использования разделителя ребер по мнению авторов метода предпочтительнее. Этот факт они связывают с тем, что связи между объектами, помещенными в один кластер на ранних этапах объединения, сильнее, чем на поздних.&lt;br /&gt;
&lt;br /&gt;
Далее, алгоритм применяет агломеративную иерархическую кластеризацию с использованием вышеозначенных показателей. Причем существует две стратегии их учета. Первая подразумевает наличие некоторых пороговых значений. T­RI и T­RC. В соответствии с этой стратегией, алгоритм для каждого кластера Ci проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер Сj, с которым у кластера Ci получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры T­RI и T­RC могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основное отличие данного подхода от классических агломеративных иерархических методов в том, что, во-первых, на каждом шаге могут быть объединены несколько кластеров, а, во-вторых, на каком-то этапе ни одна пара кластеров не будет удовлетворять вышеуказанным условиям и такое разбиение будет считаться оптимальным, то есть в конце может не получиться один всеохватывающий кластер. Если данное разбиение не удовлетворяет выбранным критериям, то пороговые значения можно уменьшить.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где a выбирается пользователем. Если a &amp;gt; 1, то алгоритм придает большее значение относительному взаимному сходству, а если a &amp;lt; 1, то большее значение имеет относительная взаимная связность. Разумеется, данный подход позволяет получить полную дендрограмму кластерного анализа.&lt;br /&gt;
&lt;br /&gt;
Общая временная сложность этого алгоритма выражается как  , где n – количество анализируемых документов, m­ – количество получившихся после первого этапа малых кластеров.&lt;/div&gt;</summary>
		<author><name>Артем Таран</name></author>
	</entry>
</feed>