<?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=ShimchikN</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=ShimchikN"/>
	<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/ShimchikN"/>
	<updated>2026-10-22T17:17:36Z</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=17798</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=17798"/>
		<updated>2016-11-16T19:40:43Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: &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;
Следует отметить, что конечное число кластеров не задаётся явным образом и зависит как от выбора параметров алгоритма, так и от внутренней структуры входных данных.&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>ShimchikN</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=17782</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=17782"/>
		<updated>2016-11-16T19:13:45Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: /* Масштабируемость алгоритма и его реализации */&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: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>ShimchikN</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Cham_eff.png&amp;diff=17780</id>
		<title>Файл:Cham eff.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Cham_eff.png&amp;diff=17780"/>
		<updated>2016-11-16T19:12:23Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>ShimchikN</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Cham_speedup.png&amp;diff=17779</id>
		<title>Файл:Cham speedup.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Cham_speedup.png&amp;diff=17779"/>
		<updated>2016-11-16T19:11:54Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>ShimchikN</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=17749</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=17749"/>
		<updated>2016-11-16T16:13:23Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: &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;
=== Динамические характеристики и эффективность реализации алгоритма ===&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>ShimchikN</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=17748</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=17748"/>
		<updated>2016-11-16T16:04:17Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: /* Данные */&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;
Алгоритм кластеризации 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 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>ShimchikN</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=14236</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=14236"/>
		<updated>2016-10-27T18:06:14Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: /* Свойства алгоритма */&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;
Алгоритм кластеризации 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>ShimchikN</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=14235</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=14235"/>
		<updated>2016-10-27T18:02:18Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: /* Свойства алгоритма */&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;
Алгоритм кластеризации 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;
Вычислительную мощность для разных этапов алгоритма можно оценить как:&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>ShimchikN</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=10400</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=10400"/>
		<updated>2016-10-15T16:00:49Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: /* Ресурс параллелизма алгоритма */&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; ближайших соседей. Таким образом, его параллельная сложность составляет &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>ShimchikN</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Chameleon_inforgraph.png&amp;diff=10329</id>
		<title>Файл:Chameleon inforgraph.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Chameleon_inforgraph.png&amp;diff=10329"/>
		<updated>2016-10-15T15:49:56Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: ShimchikN загрузил новую версию Файл:Chameleon inforgraph.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>ShimchikN</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=10321</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=10321"/>
		<updated>2016-10-15T15:48:51Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: /* Свойства алгоритма */&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>ShimchikN</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=10292</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=10292"/>
		<updated>2016-10-15T15:44:37Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: /* Свойства алгоритма */&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>ShimchikN</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Chameleon_inforgraph.png&amp;diff=10286</id>
		<title>Файл:Chameleon inforgraph.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Chameleon_inforgraph.png&amp;diff=10286"/>
		<updated>2016-10-15T15:43:29Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: ShimchikN загрузил новую версию Файл:Chameleon inforgraph.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>ShimchikN</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=10282</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=10282"/>
		<updated>2016-10-15T15:42:09Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: /* Информационный граф */&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;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>ShimchikN</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Chameleon_inforgraph.png&amp;diff=10277</id>
		<title>Файл:Chameleon inforgraph.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Chameleon_inforgraph.png&amp;diff=10277"/>
		<updated>2016-10-15T15:41:06Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: ShimchikN загрузил новую версию Файл:Chameleon inforgraph.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>ShimchikN</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=10089</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=10089"/>
		<updated>2016-10-15T14:59:11Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: &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]]&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>ShimchikN</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=9538</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=9538"/>
		<updated>2016-10-15T12:46:45Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: /* Литература */&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;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>ShimchikN</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=9537</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=9537"/>
		<updated>2016-10-15T12:46:17Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: /* Литература */&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;/div&gt;</summary>
		<author><name>ShimchikN</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=9451</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=9451"/>
		<updated>2016-10-15T12:25:51Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: &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;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&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>ShimchikN</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=9430</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=9430"/>
		<updated>2016-10-15T12:17:16Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: /* Информационный граф */&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;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&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>ShimchikN</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Chameleon_inforgraph.png&amp;diff=9423</id>
		<title>Файл:Chameleon inforgraph.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Chameleon_inforgraph.png&amp;diff=9423"/>
		<updated>2016-10-15T12:16:01Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>ShimchikN</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=9316</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=9316"/>
		<updated>2016-10-15T11:42:15Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: /* Схема реализации последовательного алгоритма */&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;
Возможна реализация алгоритма 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>ShimchikN</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=9312</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=9312"/>
		<updated>2016-10-15T11:40:54Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: /* Схема реализации последовательного алгоритма */&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]]&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>ShimchikN</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Chameleon_stage_3.png&amp;diff=9311</id>
		<title>Файл:Chameleon stage 3.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Chameleon_stage_3.png&amp;diff=9311"/>
		<updated>2016-10-15T11:40:44Z</updated>

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

		<summary type="html">&lt;p&gt;ShimchikN: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>ShimchikN</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=9302</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=9302"/>
		<updated>2016-10-15T11:38:27Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: /* Схема реализации последовательного алгоритма */&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]]&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>ShimchikN</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=9181</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=9181"/>
		<updated>2016-10-15T10:59:06Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: &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;
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>ShimchikN</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=9177</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=9177"/>
		<updated>2016-10-15T10:58:20Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: /* Математическое описание алгоритма */&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;K&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;
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>ShimchikN</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=9173</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=9173"/>
		<updated>2016-10-15T10:57:53Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: /* Математическое описание алгоритма */&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;), показывающий отображение исходного множества точек на набор кластеров C.&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>ShimchikN</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=8269</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=8269"/>
		<updated>2016-10-14T21:28:50Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: /* Ресурс параллелизма алгоритма */&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;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\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;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]], [[Участник:ShimchikN|Шимчик Никита Владимирович]].&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;
&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;
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;n&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;\frac{n (n - 1)}{2}&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;
На первом этапе 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>ShimchikN</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=8121</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=8121"/>
		<updated>2016-10-14T20:31:21Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: /* Вычислительное ядро алгоритма */&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;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\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;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]], [[Участник:ShimchikN|Шимчик Никита Владимирович]].&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;
&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;
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; ближайших соседей.&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;n&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;\frac{n (n - 1)}{2}&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;
На первом этапе 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>ShimchikN</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=8017</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=8017"/>
		<updated>2016-10-14T19:21:11Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: /* Схема реализации последовательного алгоритма */&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;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\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;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]], [[Участник:ShimchikN|Шимчик Никита Владимирович]].&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;
=== Макроструктура алгоритма ===&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;
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; ближайших соседей.&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;n&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;\frac{n (n - 1)}{2}&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;
На первом этапе 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>ShimchikN</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=7959</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=7959"/>
		<updated>2016-10-14T18:58:39Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: /* Данные */&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;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\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;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]], [[Участник:ShimchikN|Шимчик Никита Владимирович]].&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;
=== Макроструктура алгоритма ===&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&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; ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&lt;br /&gt;
&lt;br /&gt;
* Объём входных данных: &amp;lt;math&amp;gt;n&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;\frac{n (n - 1)}{2}&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;
На первом этапе 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>ShimchikN</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=7918</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=7918"/>
		<updated>2016-10-14T18:40:52Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: /* Свойства алгоритма */&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;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\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;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]], [[Участник:ShimchikN|Шимчик Никита Владимирович]].&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;
=== Макроструктура алгоритма ===&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&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; ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&lt;br /&gt;
&lt;br /&gt;
* Объём входных данных: &amp;lt;math&amp;gt;n&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;\frac{n (n - 1)}{2}&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;
На первом этапе 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>ShimchikN</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=7916</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=7916"/>
		<updated>2016-10-14T18:40:22Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: &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;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\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;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]], [[Участник:ShimchikN|Шимчик Никита Владимирович]].&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;
=== Макроструктура алгоритма ===&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&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; ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&lt;br /&gt;
&lt;br /&gt;
* Объём входных данных: &amp;lt;math&amp;gt;n&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;\frac{n (n - 1)}{2}&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;
На первом этапе 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>ShimchikN</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=7906</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=7906"/>
		<updated>2016-10-14T18:36:05Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: /* Ресурс параллелизма алгоритма */&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;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\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;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]], [[Участник:ShimchikN|Шимчик Никита Владимирович]].&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;
=== Макроструктура алгоритма ===&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&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; ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&lt;br /&gt;
&lt;br /&gt;
* Объём входных данных: &amp;lt;math&amp;gt;n&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;\frac{n (n - 1)}{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;
На первом этапе 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>ShimchikN</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=7903</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=7903"/>
		<updated>2016-10-14T18:35:40Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: /* Ресурс параллелизма алгоритма */&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;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\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;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]], [[Участник:ShimchikN|Шимчик Никита Владимирович]].&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;
=== Макроструктура алгоритма ===&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&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; ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&lt;br /&gt;
&lt;br /&gt;
* Объём входных данных: &amp;lt;math&amp;gt;n&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;\frac{n (n - 1)}{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;
На первом этапе 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>ShimchikN</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=7884</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=7884"/>
		<updated>2016-10-14T18:17:19Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: /* Данные */&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;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\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;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]], [[Участник:ShimchikN|Шимчик Никита Владимирович]].&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;
=== Макроструктура алгоритма ===&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&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;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&lt;br /&gt;
&lt;br /&gt;
* Объём входных данных: &amp;lt;math&amp;gt;n&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;\frac{n (n - 1)}{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;
На первом этапе 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>ShimchikN</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=7883</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=7883"/>
		<updated>2016-10-14T18:16:46Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: /* Определения */&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;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\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;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]], [[Участник:ShimchikN|Шимчик Никита Владимирович]].&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;
=== Макроструктура алгоритма ===&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&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;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&lt;br /&gt;
&lt;br /&gt;
* Объём входных данных: &amp;lt;math&amp;gt;n&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;\frac{n (n - 1)}{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;
На первом этапе 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>ShimchikN</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=7875</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=7875"/>
		<updated>2016-10-14T18:09:49Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: /* Данные */&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;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\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;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]], [[Участник:ShimchikN|Шимчик Никита Владимирович]].&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;&#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;&#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;&#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;&#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;&#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;&#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;&#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;&#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;
=== Макроструктура алгоритма ===&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&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;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&lt;br /&gt;
&lt;br /&gt;
* Объём входных данных: &amp;lt;math&amp;gt;n&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;\frac{n (n - 1)}{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;
На первом этапе 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>ShimchikN</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=7842</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=7842"/>
		<updated>2016-10-14T17:46:52Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: /* Определения */&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;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\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;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]], [[Участник:ShimchikN|Шимчик Никита Владимирович]].&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;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;G&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;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: набор кластеров &amp;lt;math&amp;gt;\{K_{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;&#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;), показывающий отображение исходного множества точек на множество кластеров, полученное на третьем этапе.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#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;&#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;&#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;&#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;&#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;&#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;&#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;&#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;
=== Макроструктура алгоритма ===&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&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;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&lt;br /&gt;
&lt;br /&gt;
* Объём входных данных: &amp;lt;math&amp;gt;n&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;\frac{n (n - 1)}{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;
На первом этапе 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>ShimchikN</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=7834</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=7834"/>
		<updated>2016-10-14T17:40:02Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: /* Математическое описание алгоритма */&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;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\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;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]], [[Участник:ShimchikN|Шимчик Никита Владимирович]].&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;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;G&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;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: набор кластеров &amp;lt;math&amp;gt;\{K_{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;&#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;), показывающий отображение исходного множества точек на множество кластеров, полученное на третьем этапе.&lt;br /&gt;
&lt;br /&gt;
==== Определения ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#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;&#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;&#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;&#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;&#039;Относительное взаимное сходство пары кластеров&#039;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#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;&#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;&#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;&#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;
=== Макроструктура алгоритма ===&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&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;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&lt;br /&gt;
&lt;br /&gt;
* Объём входных данных: &amp;lt;math&amp;gt;n&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;\frac{n (n - 1)}{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;
На первом этапе 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>ShimchikN</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=7833</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=7833"/>
		<updated>2016-10-14T17:39:38Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: /* Математическое описание алгоритма */&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;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\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;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]], [[Участник:ShimchikN|Шимчик Никита Владимирович]].&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;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;G&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;&#039;Промежуточный результат после третьего этапа&#039;&#039;&#039;: набор кластеров &amp;lt;math&amp;gt;\{K_{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;&#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;), показывающий отображение исходного множества точек на множество кластеров, полученное на третьем этапе.&lt;br /&gt;
&lt;br /&gt;
==== Определения&lt;br /&gt;
&lt;br /&gt;
&#039;&#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;&#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;&#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;&#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;&#039;Относительное взаимное сходство пары кластеров&#039;&#039;&#039; определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#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;&#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;&#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;&#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;
=== Макроструктура алгоритма ===&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&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;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&lt;br /&gt;
&lt;br /&gt;
* Объём входных данных: &amp;lt;math&amp;gt;n&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;\frac{n (n - 1)}{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;
На первом этапе 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>ShimchikN</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=7792</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=7792"/>
		<updated>2016-10-14T17:05:50Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: /* Входные и выходные данные алгоритма */&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;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\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;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]], [[Участник:ShimchikN|Шимчик Никита Владимирович]].&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;
Исходные данные: множество точек в метрическом пространстве, которое можно задать через треугольную матрицу сходства объектов &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;
Промежуточный результат после первого этапа: граф &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;
Промежуточный результат после второго этапа: &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;).&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; с вершинами из &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;
Относительная взаимная &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; определяется формулой:&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;
Относительное взаимное сходство пары кластеров определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&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; и &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})}&amp;lt;/math&amp;gt; между парой кластеров &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;,&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;
=== Макроструктура алгоритма ===&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&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;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&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; (где n — количество объектов), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует расстояние между i-м и j-м объектами.&lt;br /&gt;
&lt;br /&gt;
* Объём входных данных: &amp;lt;math&amp;gt;n&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;\frac{n (n - 1)}{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;
На первом этапе 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>ShimchikN</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=7790</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=7790"/>
		<updated>2016-10-14T17:05:27Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: /* Математическое описание алгоритма */&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;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\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;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]], [[Участник:ShimchikN|Шимчик Никита Владимирович]].&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;
Исходные данные: множество точек в метрическом пространстве, которое можно задать через треугольную матрицу сходства объектов &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;
Промежуточный результат после первого этапа: граф &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;
Промежуточный результат после второго этапа: &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;).&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; с вершинами из &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;
Относительная взаимная &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; определяется формулой:&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;
Относительное взаимное сходство пары кластеров определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&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; и &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})}&amp;lt;/math&amp;gt; между парой кластеров &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;,&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;
=== Макроструктура алгоритма ===&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&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;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: треугольная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*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;
* Объём входных данных: &amp;lt;math&amp;gt;n&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;\frac{n (n - 1)}{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;
На первом этапе 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>ShimchikN</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=6630</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=6630"/>
		<updated>2016-10-13T17:03:59Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Графо-ориентированный алгоритм кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm+nlog(n)+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;np&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;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]], [[Участник:ShimchikN|Шимчик Никита Владимирович]].&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;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
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;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности n на p (где n — количество объектов, а p — размерность пространства), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует j-я координата i-го объекта.&lt;br /&gt;
&lt;br /&gt;
* Объём входных данных: &amp;lt;math&amp;gt;np&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;
== Литература ==&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>ShimchikN</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=6623</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=6623"/>
		<updated>2016-10-13T17:00:12Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Графо-ориентированный алгоритм кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm+nlog(n)+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;np&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;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]], [[Участник:ShimchikN|Шимчик Никита Владимирович]].&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;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
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;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности n на p (где n -- количество объектов, а p -- размерность пространства), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует j-я координата i-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;np&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: n-мерный вектор v, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &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;
Данный алгоритм выполняется в два этапа.&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>ShimchikN</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=6622</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=6622"/>
		<updated>2016-10-13T16:59:48Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Графо-ориентированный алгоритм кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm+nlog(n)+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;np&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]], [[Участник:ShimchikN|Шимчик Никита Владимирович]].&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;
1) Построение графа, путём добавления рёбер по принципу k ближайших соседей.&lt;br /&gt;
2) Выделение множества сравнительно малых связных подграфов.&lt;br /&gt;
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;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности n на p (где n -- количество объектов, а p -- размерность пространства), в которой элементу &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствует j-я координата i-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;np&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: n-мерный вектор v, в котором элементу &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt; соответствует номер кластера, присвоенный i-му объекту&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &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;
Данный алгоритм выполняется в два этапа.&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>ShimchikN</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&amp;diff=6587</id>
		<title>Участник:Артем Таран</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&amp;diff=6587"/>
		<updated>2016-10-13T16:14:46Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: Новая страница: «Артём Таран Иванович. Студент 616 группы ВМК МГУ.»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Артём Таран Иванович.&lt;br /&gt;
Студент 616 группы ВМК МГУ.&lt;/div&gt;</summary>
		<author><name>ShimchikN</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=6584</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=6584"/>
		<updated>2016-10-13T16:13:51Z</updated>

		<summary type="html">&lt;p&gt;ShimchikN: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Графо-ориентированный алгоритм кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm+nlog(n)+m^2log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Статью подготовили: [[Участник:Артем_Таран|Артём Таран Иванович]], [[Участник:ShimchikN|Шимчик Никита Владимирович]].&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;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>ShimchikN</name></author>
	</entry>
</feed>