<?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=Divanov</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=Divanov"/>
	<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/Divanov"/>
	<updated>2026-10-22T22:08:32Z</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=20023</id>
		<title>Участник:Иванов Даниил/Алгоритм устойчивой кластеризации с иcпользованием связей</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=20023"/>
		<updated>2016-12-04T16:11:51Z</updated>

		<summary type="html">&lt;p&gt;Divanov: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм устойчивой кластеризации с иcпользованием связей&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(n^2 + n m_m m_a + n^2 \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; (n объектов с k признаками)&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (метки кластеров для каждого объекта)&lt;br /&gt;
}}&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
:Алгоритм устойчивой кластеризации с иcпользованием связей (&#039;&#039;&#039;robust clustering using links&#039;&#039;&#039;, &#039;&#039;ROCK&#039;&#039;) решает задачу [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F кластеризации] объектов по заранее заданному количеству &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. В пространстве объектов должна быть определена функция сходства/расстояния между объекта &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;. Данный алгоритм относится к иерархическим методам кластеризации, который начинает с разбиения пространства на большое количество кластеров и постепенно объединяя их до нужного количества. Алгоритм пытается объединить в один кластер точки с максимальным числом общих соседей.&lt;br /&gt;
&lt;br /&gt;
:Данный алгоритм хорошо подходит для объектов с категориальными признаками (то есть признаками, принимающими небольшое количество значений). С помощью этого алгоритма также часто решается задача [https://en.wikipedia.org/wiki/Association_rule_learning поиска ассоциативных правил].&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
:Пусть дано множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;, натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;, пороговое значение &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt; и функция функция &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
:Результатом работы алгоритма является &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; непересекающихся кластеров, делящих множество &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Две точки называются &#039;&#039;соседними&#039;&#039;, если &amp;lt;math&amp;gt;sim(p_i, p_j) \geq \theta&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Количеством общих соседей &amp;lt;math&amp;gt;link(p_i, p_j)&amp;lt;/math&amp;gt; называется число точек, являющимися соседними для точек &amp;lt;math&amp;gt;p_i, p_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией связи между кластерами называется &amp;lt;math&amp;gt;link[C_i, C_j] = \sum_{\begin{smallmatrix}p_q\in C_i,\; p_r\in C_j\end{smallmatrix}}^{ } link(p_{q},p_r)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией качества является функция&lt;br /&gt;
:&amp;lt;math&amp;gt; g(C_i, C_j) = \frac{link[C_i,C_j]}{(n_i + n_j)^{1 + 2f(\theta )} - n_i^{1+2f(\theta )} - n_j^{1+2f(\theta )}}&amp;lt;/math&amp;gt;,  где &amp;lt;math&amp;gt;n_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;n&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
:Затем на каждом шаге он вычисляет значение &amp;lt;math&amp;gt;g(C_i, C_j)&amp;lt;/math&amp;gt; для каждой пары кластеров и объединяет эти кластеры в один.&lt;br /&gt;
:Алгоритм ведёт свою работу до тех пор, пока не получит &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:В качестве функции &amp;lt;math&amp;gt;f( \theta )&amp;lt;/math&amp;gt; обычно используется функция &amp;lt;math&amp;gt;f(\theta ) = \frac{\theta - 1}{\theta + 1}&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;n_i^{1+2f(\theta )}&amp;lt;/math&amp;gt; - ожидаемое число связей между парами объектов кластера &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Если все признаки категориальны, то в качестве функции схожести можно использовать функцию:&lt;br /&gt;
:&amp;lt;math&amp;gt;sim(p_i,p_j) = \frac{|p_i\cap p_j|}{|p_i\cup p_j|}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|p_i|&amp;lt;/math&amp;gt; - количество атрибутов в &amp;lt;math&amp;gt;p_i&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-k&amp;lt;/math&amp;gt; шагов кластеры последовательно объединяются. Реализовывается с помощью структуры данных &#039;&#039;куча&#039;&#039;. Для каждого кластера math&amp;gt;i&amp;lt;/math&amp;gt; хранится своя куча &amp;lt;math&amp;gt;q[i]&amp;lt;/math&amp;gt;, содержащая все связанный с ним кластеры, упорядоченная по убыванию функции качества. Также хранится глобальная куча &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, содержащая все кластеры &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, упорядоченные по мере убывания функции качества &amp;lt;math&amp;gt;g(j, max(q[j]))&amp;lt;/math&amp;gt;. На каждом шаге итерации, после объединения кластеров требуется перестроить кучи объединённых кластеров в одну и перестроить глобальную кучу.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
:Макроструктура состоит из последовательного выполнения двух шагов, описанных в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]]:&lt;br /&gt;
# Построении матрицы связей&lt;br /&gt;
# Пересчёте куч и объединении кластеров&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Описание реализации алгоритма на псевдокоде&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line&amp;gt;&lt;br /&gt;
procedure cluster(S, k)&lt;br /&gt;
begin&lt;br /&gt;
    link := compute_links(S)&lt;br /&gt;
    for s in S do&lt;br /&gt;
    begin&lt;br /&gt;
        q[s] := build_local_heap(link, s)&lt;br /&gt;
    end&lt;br /&gt;
    Q := build_global_heap(S, q)&lt;br /&gt;
    while size(Q) &amp;gt; k do&lt;br /&gt;
    begin&lt;br /&gt;
        u := extract_max(Q)&lt;br /&gt;
        v := max(q[u])&lt;br /&gt;
        delete(Q, v)&lt;br /&gt;
        w := merge(u, v)&lt;br /&gt;
        for each x in q[u] or q[v] do&lt;br /&gt;
        begin&lt;br /&gt;
            link[x, w] := link[x, u] + link[x, v]&lt;br /&gt;
            delete(q[x], u)&lt;br /&gt;
            delete(q[x], v)&lt;br /&gt;
            insert(q[x], w, g(x, w))&lt;br /&gt;
            insert(q[w], x, g(x, w))&lt;br /&gt;
            update(Q, x, q[x])&lt;br /&gt;
        end&lt;br /&gt;
        insert(Q, w, q[w])&lt;br /&gt;
        deallocate(q[u])&lt;br /&gt;
        deallocate(q[v])&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Временная сложность&#039;&#039;&#039;:&lt;br /&gt;
*Инициализация глобальной кучи - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Инициализация локальной кучи - требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Вычисление связей между парой точек - в худшем случае алгоритмом Штрассена вычисляется за &amp;lt;math&amp;gt;O(n*n^{2.37})&amp;lt;/math&amp;gt;, в среднем за &amp;lt;math&amp;gt;O(n m_\alpha m_m)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Построение каждой кучи - &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Сортировка каждой кучи -  &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Основной цикл объединения кластеров выполняется в &amp;lt;math&amp;gt;n-k&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
**Вставить новый кластер в в &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt; локальных куч размера &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt; &lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(n^2 + n m_m m_a + n^2 \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Сложность по памяти&#039;&#039;&#039;:&lt;br /&gt;
*Поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей, то общие затраты памяти не превышают &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Хранение связей - &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt; &#039;&#039;(поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей)&#039;&#039;&lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(\min \{ n^2, n m_m m_a \} )&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:Divanov dia2.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма == &lt;br /&gt;
&lt;br /&gt;
# Вычисление соседей. Затраты данных операций при условии достаточного количества ядер &amp;lt;math&amp;gt;T_1 = O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
# Построения связей происходит в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; этапов, в каждом из которых нужно сделать &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; расчетов(с учетом распараллеливания), где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество соседей. В худшем случае &amp;lt;math&amp;gt;T_2 = O(n^2)&amp;lt;/math&amp;gt; в среднем случае &amp;lt;math&amp;gt;T_2 = O(n * m_a)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_a&amp;lt;/math&amp;gt; среднее ожидаемое число соседей.&lt;br /&gt;
# Построение одной кучи имеет сложность &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;. Для каждой кучи сортировка &amp;lt;math&amp;gt;O(n * log(n))&amp;lt;/math&amp;gt;. Итоговая сложность создания локальных куч &amp;lt;math&amp;gt;T_3 = O(n * log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Построение и сортировка глобальной кучи: &amp;lt;math&amp;gt;T_4 = O(n * log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
# В цикле происходит выбор кластеров, сливание, пересчет и обновление куч. Для всех элементов кучи слитых кластеров пересчитывается значение связи, вставляется в кучу выбранного кластера информация о новом кластере, удаляется старое. Сложность &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;. В худшем случае, одна итерация цикла происходит за &amp;lt;math&amp;gt;T_i = O(log(n))&amp;lt;/math&amp;gt;. Количество итераций n - k. Итого: &amp;lt;math&amp;gt;T_5 = O((n - k) * log(n))&amp;lt;/math&amp;gt;. При k = 1, &amp;lt;math&amp;gt;T_5 = O(n * log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Итоговая сложность в худшем случае равна:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;T_1 + T_2 + T_3 + T_4 + T_5 = O(n) + O(n^2) + O(n * log(n)) + O(n * log(n)) + O(n * log(n)) = O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Итоговая сложность в среднем случае равна:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(n * m_a) + O(n * log(n))&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Сложность по времени:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(n * (m_a + log(n)))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Входные данные алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;&lt;br /&gt;
*Целевое количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
*Матрица размера &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt; (n объектов по k признаков)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Гиперпараметры алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Пороговое значение схожести &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt;&lt;br /&gt;
*Функция ожидания количества соседей &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Результат:&#039;&#039;&#039;&lt;br /&gt;
*Метка кластера для каждого объекта&lt;br /&gt;
*Объём данных: &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; меток кластера&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
*Детерменированность&lt;br /&gt;
*Устойчивость&lt;br /&gt;
*Вычислительная мощность алгоритма: &amp;lt;math&amp;gt;\frac{O(n^2 + n m_m m_a + n^2 \log{} n)}{n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Отношение последовательной и параллельной сложностей: &amp;lt;math&amp;gt;\frac{O(n^2 + n m_m m_a + n^2 \log{} n)}{O(n * (m_a + log(n)))}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Остальные свойства&lt;br /&gt;
*ROCK-алгоритм хорошо подходит для категорийных данных (т.е. каждый атрибут объекта принадлежит к небольшому множеству возможных признаков. Например: цвет)&lt;br /&gt;
*Хорошая масштабируемость алгоритма по данным&lt;br /&gt;
*Скорость работы алгоритма зависит от разреженности объектов в пространстве признаков. Чем меньше среднее количество соседей у объектов во входных данных, тем быстрее работает алгоритм&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
*Реализация алгоритма присутствует в пакете CBA для языка R &amp;lt;ref&amp;gt;https://en.wikibooks.org/wiki/Data_Mining_Algorithms_In_R/Clustering/RockCluster&amp;lt;/ref&amp;gt;&lt;br /&gt;
*Реализация алгоритма для языка Java &amp;lt;ref&amp;gt;https://sourceforge.net/projects/feed4weka/files/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Divanov</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=20011</id>
		<title>Участник:Иванов Даниил/Алгоритм устойчивой кластеризации с иcпользованием связей</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=20011"/>
		<updated>2016-12-04T10:35:41Z</updated>

		<summary type="html">&lt;p&gt;Divanov: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм устойчивой кластеризации с иcпользованием связей&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(n^2 + n m_m m_a + n^2 \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; (n объектов с k признаками)&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (метки кластеров для каждого объекта)&lt;br /&gt;
}}&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
:Алгоритм устойчивой кластеризации с иcпользованием связей (&#039;&#039;&#039;robust clustering using links&#039;&#039;&#039;, &#039;&#039;ROCK&#039;&#039;) решает задачу [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F кластеризации] объектов по заранее заданному количеству &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. В пространстве объектов должна быть определена функция сходства/расстояния между объекта &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;. Данный алгоритм относится к иерархическим методам кластеризации, который начинает с разбиения пространства на большое количество кластеров и постепенно объединяя их до нужного количества. Алгоритм пытается объединить в один кластер точки с максимальным числом общих соседей.&lt;br /&gt;
&lt;br /&gt;
:Данный алгоритм хорошо подходит для объектов с категориальными признаками (то есть признаками, принимающими небольшое количество значений). С помощью этого алгоритма также часто решается задача [https://en.wikipedia.org/wiki/Association_rule_learning поиска ассоциативных правил].&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
:Пусть дано множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;, натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;, пороговое значение &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt; и функция функция &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
:Результатом работы алгоритма является &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; непересекающихся кластеров, делящих множество &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Две точки называются &#039;&#039;соседними&#039;&#039;, если &amp;lt;math&amp;gt;sim(p_i, p_j) \geq \theta&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Количеством общих соседей &amp;lt;math&amp;gt;link(p_i, p_j)&amp;lt;/math&amp;gt; называется число точек, являющимися соседними для точек &amp;lt;math&amp;gt;p_i, p_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией связи между кластерами называется &amp;lt;math&amp;gt;link[C_i, C_j] = \sum_{\begin{smallmatrix}p_q\in C_i,\; p_r\in C_j\end{smallmatrix}}^{ } link(p_{q},p_r)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией качества является функция&lt;br /&gt;
:&amp;lt;math&amp;gt; g(C_i, C_j) = \frac{link[C_i,C_j]}{(n_i + n_j)^{1 + 2f(\theta )} - n_i^{1+2f(\theta )} - n_j^{1+2f(\theta )}}&amp;lt;/math&amp;gt;,  где &amp;lt;math&amp;gt;n_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;n&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
:Затем на каждом шаге он вычисляет значение &amp;lt;math&amp;gt;g(C_i, C_j)&amp;lt;/math&amp;gt; для каждой пары кластеров и объединяет эти кластеры в один.&lt;br /&gt;
:Алгоритм ведёт свою работу до тех пор, пока не получит &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:В качестве функции &amp;lt;math&amp;gt;f( \theta )&amp;lt;/math&amp;gt; обычно используется функция &amp;lt;math&amp;gt;f(\theta ) = \frac{\theta - 1}{\theta + 1}&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;n_i^{1+2f(\theta )}&amp;lt;/math&amp;gt; - ожидаемое число связей между парами объектов кластера &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Если все признаки категориальны, то в качестве функции схожести можно использовать функцию:&lt;br /&gt;
:&amp;lt;math&amp;gt;sim(p_i,p_j) = \frac{|p_i\cap p_j|}{|p_i\cup p_j|}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|p_i|&amp;lt;/math&amp;gt; - количество атрибутов в &amp;lt;math&amp;gt;p_i&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-k&amp;lt;/math&amp;gt; шагов кластеры последовательно объединяются. Реализовывается с помощью структуры данных &#039;&#039;куча&#039;&#039;. Для каждого кластера math&amp;gt;i&amp;lt;/math&amp;gt; хранится своя куча &amp;lt;math&amp;gt;q[i]&amp;lt;/math&amp;gt;, содержащая все связанный с ним кластеры, упорядоченная по убыванию функции качества. Также хранится глобальная куча &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, содержащая все кластеры &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, упорядоченные по мере убывания функции качества &amp;lt;math&amp;gt;g(j, max(q[j]))&amp;lt;/math&amp;gt;. На каждом шаге итерации, после объединения кластеров требуется перестроить кучи объединённых кластеров в одну и перестроить глобальную кучу.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
:Макроструктура состоит из последовательного выполнения двух шагов, описанных в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]]:&lt;br /&gt;
# Построении матрицы связей&lt;br /&gt;
# Пересчёте куч и объединении кластеров&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Описание реализации алгоритма на псевдокоде&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line&amp;gt;&lt;br /&gt;
procedure cluster(S, k)&lt;br /&gt;
begin&lt;br /&gt;
    link := compute_links(S)&lt;br /&gt;
    for s in S do&lt;br /&gt;
    begin&lt;br /&gt;
        q[s] := build_local_heap(link, s)&lt;br /&gt;
    end&lt;br /&gt;
    Q := build_global_heap(S, q)&lt;br /&gt;
    while size(Q) &amp;gt; k do&lt;br /&gt;
    begin&lt;br /&gt;
        u := extract_max(Q)&lt;br /&gt;
        v := max(q[u])&lt;br /&gt;
        delete(Q, v)&lt;br /&gt;
        w := merge(u, v)&lt;br /&gt;
        for each x in q[u] or q[v] do&lt;br /&gt;
        begin&lt;br /&gt;
            link[x, w] := link[x, u] + link[x, v]&lt;br /&gt;
            delete(q[x], u)&lt;br /&gt;
            delete(q[x], v)&lt;br /&gt;
            insert(q[x], w, g(x, w))&lt;br /&gt;
            insert(q[w], x, g(x, w))&lt;br /&gt;
            update(Q, x, q[x])&lt;br /&gt;
        end&lt;br /&gt;
        insert(Q, w, q[w])&lt;br /&gt;
        deallocate(q[u])&lt;br /&gt;
        deallocate(q[v])&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Временная сложность&#039;&#039;&#039;:&lt;br /&gt;
*Инициализация глобальной кучи - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Инициализация локальной кучи - требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Вычисление связей между парой точек - в худшем случае алгоритмом Штрассена вычисляется за &amp;lt;math&amp;gt;O(n*n^{2.37})&amp;lt;/math&amp;gt;, в среднем за &amp;lt;math&amp;gt;O(n m_\alpha m_m)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Построение каждой кучи - &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Сортировка каждой кучи -  &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Основной цикл объединения кластеров выполняется в &amp;lt;math&amp;gt;n-k&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
**Вставить новый кластер в в &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt; локальных куч размера &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt; &lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(n^2 + n m_m m_a + n^2 \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Сложность по памяти&#039;&#039;&#039;:&lt;br /&gt;
*Поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей, то общие затраты памяти не превышают &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Хранение связей - &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt; &#039;&#039;(поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей)&#039;&#039;&lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(\min \{ n^2, n m_m m_a \} )&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:Divanov dia2.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма == &lt;br /&gt;
&lt;br /&gt;
# Вычисление соседей. Затраты данных операций при условии достаточного количества ядер &amp;lt;math&amp;gt;T_1 = O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
# Построения связей происходит в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; этапов, в каждом из которых нужно сделать &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; расчетов(с учетом распараллеливания), где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество соседей. В худшем случае &amp;lt;math&amp;gt;T_2 = O(n^2)&amp;lt;/math&amp;gt; в среднем случае &amp;lt;math&amp;gt;T_2 = O(n * m_a)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_a&amp;lt;/math&amp;gt; среднее ожидаемое число соседей.&lt;br /&gt;
# Построение одной кучи имеет сложность &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;. Для каждой кучи сортировка &amp;lt;math&amp;gt;O(n * log(n))&amp;lt;/math&amp;gt;. Итоговая сложность создания локальных куч &amp;lt;math&amp;gt;T_3 = O(n * log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Построение и сортировка глобальной кучи: &amp;lt;math&amp;gt;T_4 = O(n * log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
# В цикле происходит выбор кластеров, сливание, пересчет и обновление куч. Для всех элементов кучи слитых кластеров пересчитывается значение связи, вставляется в кучу выбранного кластера информация о новом кластере, удаляется старое. Сложность &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;. В худшем случае, одна итерация цикла происходит за &amp;lt;math&amp;gt;T_i = O(log(n))&amp;lt;/math&amp;gt;. Количество итераций n - k. Итого: &amp;lt;math&amp;gt;T_5 = O((n - k) * log(n))&amp;lt;/math&amp;gt;. При k = 1, &amp;lt;math&amp;gt;T_5 = O(n * log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Итоговая сложность в худшем случае равна:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;T_1 + T_2 + T_3 + T_4 + T_5 = O(n) + O(n^2) + O(n * log(n)) + O(n * log(n)) + O(n * log(n)) = O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Итоговая сложность в среднем случае равна:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(n * m_a) + O(n * log(n))&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Сложность по времени:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(n * (m_a + log(n)))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Входные данные алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;&lt;br /&gt;
*Целевое количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
*Матрица размера &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt; (n объектов по k признаков)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Гиперпараметры алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Пороговое значение схожести &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt;&lt;br /&gt;
*Функция ожидания количества соседей &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Результат:&#039;&#039;&#039;&lt;br /&gt;
*Метка кластера для каждого объекта&lt;br /&gt;
*Объём данных: &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; меток кластера&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
*Детерменированность&lt;br /&gt;
*Устойчивость&lt;br /&gt;
*Вычислительная мощность алгоритма: &amp;lt;math&amp;gt;\frac{O(n^2 + n m_m m_a + n^2 \log{} n)}{n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Отношение последовательной и параллельной сложностей: &amp;lt;math&amp;gt;\frac{O(n^2 + n m_m m_a + n^2 \log{} n)}{O(n * (m_a + log(n)))}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Остальные свойства&lt;br /&gt;
*ROCK-алгоритм хорошо подходит для категорийных данных (т.е. каждый атрибут объекта принадлежит к небольшому множеству возможных признаков. Например: цвет)&lt;br /&gt;
*Хорошая масштабируемость алгоритма по данным&lt;br /&gt;
*Скорость работы алгоритма зависит от разреженности объектов в пространстве признаков. Чем меньше среднее количество соседей у объектов во входных данных, тем быстрее работает алгоритм&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Divanov</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=20010</id>
		<title>Участник:Иванов Даниил/Алгоритм устойчивой кластеризации с иcпользованием связей</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=20010"/>
		<updated>2016-12-04T10:30:48Z</updated>

		<summary type="html">&lt;p&gt;Divanov: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм устойчивой кластеризации с иcпользованием связей&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(n^2 + n m_m m_a + n^2 \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; (n объектов с k признаками)&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (метки кластеров для каждого объекта)&lt;br /&gt;
}}&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
:Алгоритм устойчивой кластеризации с иcпользованием связей (&#039;&#039;&#039;robust clustering using links&#039;&#039;&#039;, &#039;&#039;ROCK&#039;&#039;) решает задачу [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F кластеризации] объектов по заранее заданному количеству &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. В пространстве объектов должна быть определена функция сходства/расстояния между объекта &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;. Данный алгоритм относится к иерархическим методам кластеризации, который начинает с разбиения пространства на большое количество кластеров и постепенно объединяя их до нужного количества. Алгоритм пытается объединить в один кластер точки с максимальным числом общих соседей.&lt;br /&gt;
&lt;br /&gt;
:Данный алгоритм хорошо подходит для объектов с категориальными признаками (то есть признаками, принимающими небольшое количество значений). С помощью этого алгоритма также часто решается задача [https://en.wikipedia.org/wiki/Association_rule_learning поиска ассоциативных правил].&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
:Пусть дано множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;, натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;, пороговое значение &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt; и функция функция &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
:Результатом работы алгоритма является &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; непересекающихся кластеров, делящих множество &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Две точки называются &#039;&#039;соседними&#039;&#039;, если &amp;lt;math&amp;gt;sim(p_i, p_j) \geq \theta&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Количеством общих соседей &amp;lt;math&amp;gt;link(p_i, p_j)&amp;lt;/math&amp;gt; называется число точек, являющимися соседними для точек &amp;lt;math&amp;gt;p_i, p_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией связи между кластерами называется &amp;lt;math&amp;gt;link[C_i, C_j] = \sum_{\begin{smallmatrix}p_q\in C_i,\; p_r\in C_j\end{smallmatrix}}^{ } link(p_{q},p_r)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией качества является функция&lt;br /&gt;
:&amp;lt;math&amp;gt; g(C_i, C_j) = \frac{link[C_i,C_j]}{(n_i + n_j)^{1 + 2f(\theta )} - n_i^{1+2f(\theta )} - n_j^{1+2f(\theta )}}&amp;lt;/math&amp;gt;,  где &amp;lt;math&amp;gt;n_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;n&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
:Затем на каждом шаге он вычисляет значение &amp;lt;math&amp;gt;g(C_i, C_j)&amp;lt;/math&amp;gt; для каждой пары кластеров и объединяет эти кластеры в один.&lt;br /&gt;
:Алгоритм ведёт свою работу до тех пор, пока не получит &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:В качестве функции &amp;lt;math&amp;gt;f( \theta )&amp;lt;/math&amp;gt; обычно используется функция &amp;lt;math&amp;gt;f(\theta ) = \frac{\theta - 1}{\theta + 1}&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;n_i^{1+2f(\theta )}&amp;lt;/math&amp;gt; - ожидаемое число связей между парами объектов кластера &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Если все признаки категориальны, то в качестве функции схожести можно использовать функцию:&lt;br /&gt;
:&amp;lt;math&amp;gt;sim(p_i,p_j) = \frac{|p_i\cap p_j|}{|p_i\cup p_j|}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|p_i|&amp;lt;/math&amp;gt; - количество атрибутов в &amp;lt;math&amp;gt;p_i&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-k&amp;lt;/math&amp;gt; шагов кластеры последовательно объединяются. Реализовывается с помощью структуры данных &#039;&#039;куча&#039;&#039;. Для каждого кластера math&amp;gt;i&amp;lt;/math&amp;gt; хранится своя куча &amp;lt;math&amp;gt;q[i]&amp;lt;/math&amp;gt;, содержащая все связанный с ним кластеры, упорядоченная по убыванию функции качества. Также хранится глобальная куча &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, содержащая все кластеры &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, упорядоченные по мере убывания функции качества &amp;lt;math&amp;gt;g(j, max(q[j]))&amp;lt;/math&amp;gt;. На каждом шаге итерации, после объединения кластеров требуется перестроить кучи объединённых кластеров в одну и перестроить глобальную кучу.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
:Макроструктура состоит из последовательного выполнения двух шагов, описанных в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]]:&lt;br /&gt;
# Построении матрицы связей&lt;br /&gt;
# Пересчёте куч и объединении кластеров&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Описание реализации алгоритма на псевдокоде&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line&amp;gt;&lt;br /&gt;
procedure cluster(S, k)&lt;br /&gt;
begin&lt;br /&gt;
    link := compute_links(S)&lt;br /&gt;
    for s in S do&lt;br /&gt;
    begin&lt;br /&gt;
        q[s] := build_local_heap(link, s)&lt;br /&gt;
    end&lt;br /&gt;
    Q := build_global_heap(S, q)&lt;br /&gt;
    while size(Q) &amp;gt; k do&lt;br /&gt;
    begin&lt;br /&gt;
        u := extract_max(Q)&lt;br /&gt;
        v := max(q[u])&lt;br /&gt;
        delete(Q, v)&lt;br /&gt;
        w := merge(u, v)&lt;br /&gt;
        for each x in q[u] or q[v] do&lt;br /&gt;
        begin&lt;br /&gt;
            link[x, w] := link[x, u] + link[x, v]&lt;br /&gt;
            delete(q[x], u)&lt;br /&gt;
            delete(q[x], v)&lt;br /&gt;
            insert(q[x], w, g(x, w))&lt;br /&gt;
            insert(q[w], x, g(x, w))&lt;br /&gt;
            update(Q, x, q[x])&lt;br /&gt;
        end&lt;br /&gt;
        insert(Q, w, q[w])&lt;br /&gt;
        deallocate(q[u])&lt;br /&gt;
        deallocate(q[v])&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Временная сложность&#039;&#039;&#039;:&lt;br /&gt;
*Инициализация глобальной кучи - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Инициализация локальной кучи - требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Вычисление связей между парой точек - в худшем случае алгоритмом Штрассена вычисляется за &amp;lt;math&amp;gt;O(n*n^{2.37})&amp;lt;/math&amp;gt;, в среднем за &amp;lt;math&amp;gt;O(n m_\alpha m_m)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Построение каждой кучи - &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Сортировка каждой кучи -  &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Основной цикл объединения кластеров выполняется в &amp;lt;math&amp;gt;n-k&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
**Вставить новый кластер в в &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt; локальных куч размера &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt; &lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(n^2 + n m_m m_a + n^2 \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Сложность по памяти&#039;&#039;&#039;:&lt;br /&gt;
*Поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей, то общие затраты памяти не превышают &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Хранение связей - &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt; &#039;&#039;(поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей)&#039;&#039;&lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(\min \{ n^2, n m_m m_a \} )&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:Divanov dia2.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма == &lt;br /&gt;
&lt;br /&gt;
# Вычисление соседей. Затраты данных операций при условии достаточного количества ядер &amp;lt;math&amp;gt;T_1 = O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
# Построения связей происходит в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; этапов, в каждом из которых нужно сделать &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; расчетов(с учетом распараллеливания), где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество соседей. В худшем случае &amp;lt;math&amp;gt;T_2 = O(n^2)&amp;lt;/math&amp;gt; в среднем случае &amp;lt;math&amp;gt;T_2 = O(n * m_a)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_a&amp;lt;/math&amp;gt; среднее ожидаемое число соседей.&lt;br /&gt;
# Построение одной кучи имеет сложность &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;. Для каждой кучи сортировка &amp;lt;math&amp;gt;O(n * log(n))&amp;lt;/math&amp;gt;. Итоговая сложность создания локальных куч &amp;lt;math&amp;gt;T_3 = O(n * log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Построение и сортировка глобальной кучи: &amp;lt;math&amp;gt;T_4 = O(n * log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
# В цикле происходит выбор кластеров, сливание, пересчет и обновление куч. Для всех элементов кучи слитых кластеров пересчитывается значение связи, вставляется в кучу выбранного кластера информация о новом кластере, удаляется старое. Сложность &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;. В худшем случае, одна итерация цикла происходит за &amp;lt;math&amp;gt;T_i = O(log(n))&amp;lt;/math&amp;gt;. Количество итераций n - k. Итого: &amp;lt;math&amp;gt;T_5 = O((n - k) * log(n))&amp;lt;/math&amp;gt;. При k = 1, &amp;lt;math&amp;gt;T_5 = O(n * log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Итоговая сложность в худшем случае равна:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;T_1 + T_2 + T_3 + T_4 + T_5 = O(n) + O(n^2) + O(n * log(n)) + O(n * log(n)) + O(n * log(n)) = O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Итоговая сложность в среднем случае равна:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(n * m_a) + O(n * log(n))&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Сложность по времени:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(n * (m_a + log(n)))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Входные данные алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;&lt;br /&gt;
*Целевое количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
*Матрица размера &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt; (n объектов по k признаков)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Гиперпараметры алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Пороговое значение схожести &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt;&lt;br /&gt;
*Функция ожидания количества соседей &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Результат:&#039;&#039;&#039;&lt;br /&gt;
*Метка кластера для каждого объекта&lt;br /&gt;
*Объём данных: &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; меток кластера&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
*Детерменированность&lt;br /&gt;
*Устойчивость&lt;br /&gt;
*Вычислительная мощность алгоритма: &amp;lt;math&amp;gt;\frac{O(n^2 + n m_m m_a + n^2 \log{} n)}{n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Отношение последовательной и параллельной сложностей: &amp;lt;math&amp;gt;\frac{O(n^2 + n m_m m_a + n^2 \log{} n)}{O(n * (m_a + log(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;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Divanov</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=20009</id>
		<title>Участник:Иванов Даниил/Алгоритм устойчивой кластеризации с иcпользованием связей</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=20009"/>
		<updated>2016-12-04T10:29:10Z</updated>

		<summary type="html">&lt;p&gt;Divanov: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм устойчивой кластеризации с иcпользованием связей&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(n^2 + n m_m m_a + n^2 \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; (n объектов с k признаками)&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (метки кластеров для каждого объекта)&lt;br /&gt;
}}&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
:Алгоритм устойчивой кластеризации с иcпользованием связей (&#039;&#039;&#039;robust clustering using links&#039;&#039;&#039;, &#039;&#039;ROCK&#039;&#039;) решает задачу [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F кластеризации] объектов по заранее заданному количеству &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. В пространстве объектов должна быть определена функция сходства/расстояния между объекта &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;. Данный алгоритм относится к иерархическим методам кластеризации, который начинает с разбиения пространства на большое количество кластеров и постепенно объединяя их до нужного количества. Алгоритм пытается объединить в один кластер точки с максимальным числом общих соседей.&lt;br /&gt;
&lt;br /&gt;
:Данный алгоритм хорошо подходит для объектов с категориальными признаками (то есть признаками, принимающими небольшое количество значений). С помощью этого алгоритма также часто решается задача [https://en.wikipedia.org/wiki/Association_rule_learning поиска ассоциативных правил].&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
:Пусть дано множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;, натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;, пороговое значение &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt; и функция функция &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
:Результатом работы алгоритма является &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; непересекающихся кластеров, делящих множество &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Две точки называются &#039;&#039;соседними&#039;&#039;, если &amp;lt;math&amp;gt;sim(p_i, p_j) \geq \theta&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Количеством общих соседей &amp;lt;math&amp;gt;link(p_i, p_j)&amp;lt;/math&amp;gt; называется число точек, являющимися соседними для точек &amp;lt;math&amp;gt;p_i, p_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией связи между кластерами называется &amp;lt;math&amp;gt;link[C_i, C_j] = \sum_{\begin{smallmatrix}p_q\in C_i,\; p_r\in C_j\end{smallmatrix}}^{ } link(p_{q},p_r)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией качества является функция&lt;br /&gt;
:&amp;lt;math&amp;gt; g(C_i, C_j) = \frac{link[C_i,C_j]}{(n_i + n_j)^{1 + 2f(\theta )} - n_i^{1+2f(\theta )} - n_j^{1+2f(\theta )}}&amp;lt;/math&amp;gt;,  где &amp;lt;math&amp;gt;n_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;n&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
:Затем на каждом шаге он вычисляет значение &amp;lt;math&amp;gt;g(C_i, C_j)&amp;lt;/math&amp;gt; для каждой пары кластеров и объединяет эти кластеры в один.&lt;br /&gt;
:Алгоритм ведёт свою работу до тех пор, пока не получит &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:В качестве функции &amp;lt;math&amp;gt;f( \theta )&amp;lt;/math&amp;gt; обычно используется функция &amp;lt;math&amp;gt;f(\theta ) = \frac{\theta - 1}{\theta + 1}&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;n_i^{1+2f(\theta )}&amp;lt;/math&amp;gt; - ожидаемое число связей между парами объектов кластера &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Если все признаки категориальны, то в качестве функции схожести можно использовать функцию:&lt;br /&gt;
:&amp;lt;math&amp;gt;sim(p_i,p_j) = \frac{|p_i\cap p_j|}{|p_i\cup p_j|}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|p_i|&amp;lt;/math&amp;gt; - количество атрибутов в &amp;lt;math&amp;gt;p_i&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-k&amp;lt;/math&amp;gt; шагов кластеры последовательно объединяются. Реализовывается с помощью структуры данных &#039;&#039;куча&#039;&#039;. Для каждого кластера math&amp;gt;i&amp;lt;/math&amp;gt; хранится своя куча &amp;lt;math&amp;gt;q[i]&amp;lt;/math&amp;gt;, содержащая все связанный с ним кластеры, упорядоченная по убыванию функции качества. Также хранится глобальная куча &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, содержащая все кластеры &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, упорядоченные по мере убывания функции качества &amp;lt;math&amp;gt;g(j, max(q[j]))&amp;lt;/math&amp;gt;. На каждом шаге итерации, после объединения кластеров требуется перестроить кучи объединённых кластеров в одну и перестроить глобальную кучу.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
:Макроструктура состоит из последовательного выполнения двух шагов, описанных в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]]:&lt;br /&gt;
# Построении матрицы связей&lt;br /&gt;
# Пересчёте куч и объединении кластеров&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Описание реализации алгоритма на псевдокоде&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line&amp;gt;&lt;br /&gt;
procedure cluster(S, k)&lt;br /&gt;
begin&lt;br /&gt;
    link := compute_links(S)&lt;br /&gt;
    for s in S do&lt;br /&gt;
    begin&lt;br /&gt;
        q[s] := build_local_heap(link, s)&lt;br /&gt;
    end&lt;br /&gt;
    Q := build_global_heap(S, q)&lt;br /&gt;
    while size(Q) &amp;gt; k do&lt;br /&gt;
    begin&lt;br /&gt;
        u := extract_max(Q)&lt;br /&gt;
        v := max(q[u])&lt;br /&gt;
        delete(Q, v)&lt;br /&gt;
        w := merge(u, v)&lt;br /&gt;
        for each x in q[u] or q[v] do&lt;br /&gt;
        begin&lt;br /&gt;
            link[x, w] := link[x, u] + link[x, v]&lt;br /&gt;
            delete(q[x], u)&lt;br /&gt;
            delete(q[x], v)&lt;br /&gt;
            insert(q[x], w, g(x, w))&lt;br /&gt;
            insert(q[w], x, g(x, w))&lt;br /&gt;
            update(Q, x, q[x])&lt;br /&gt;
        end&lt;br /&gt;
        insert(Q, w, q[w])&lt;br /&gt;
        deallocate(q[u])&lt;br /&gt;
        deallocate(q[v])&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Временная сложность&#039;&#039;&#039;:&lt;br /&gt;
*Инициализация глобальной кучи - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Инициализация локальной кучи - требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Вычисление связей между парой точек - в худшем случае алгоритмом Штрассена вычисляется за &amp;lt;math&amp;gt;O(n*n^{2.37})&amp;lt;/math&amp;gt;, в среднем за &amp;lt;math&amp;gt;O(n m_\alpha m_m)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Построение каждой кучи - &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Сортировка каждой кучи -  &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Основной цикл объединения кластеров выполняется в &amp;lt;math&amp;gt;n-k&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
**Вставить новый кластер в в &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt; локальных куч размера &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt; &lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(n^2 + n m_m m_a + n^2 \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Сложность по памяти&#039;&#039;&#039;:&lt;br /&gt;
*Поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей, то общие затраты памяти не превышают &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Хранение связей - &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt; &#039;&#039;(поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей)&#039;&#039;&lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(\min \{ n^2, n m_m m_a \} )&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:Divanov dia2.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма == &lt;br /&gt;
&lt;br /&gt;
# Вычисление соседей. Затраты данных операций при условии достаточного количества ядер &amp;lt;math&amp;gt;T_1 = O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
# Построения связей происходит в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; этапов, в каждом из которых нужно сделать &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; расчетов(с учетом распараллеливания), где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество соседей. В худшем случае &amp;lt;math&amp;gt;T_2 = O(n^2)&amp;lt;/math&amp;gt; в среднем случае &amp;lt;math&amp;gt;T_2 = O(n * m_a)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_a&amp;lt;/math&amp;gt; среднее ожидаемое число соседей.&lt;br /&gt;
# Построение одной кучи имеет сложность &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;. Для каждой кучи сортировка &amp;lt;math&amp;gt;O(n * log(n))&amp;lt;/math&amp;gt;. Итоговая сложность создания локальных куч &amp;lt;math&amp;gt;T_3 = O(n * log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Построение и сортировка глобальной кучи: &amp;lt;math&amp;gt;T_4 = O(n * log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
# В цикле происходит выбор кластеров, сливание, пересчет и обновление куч. Для всех элементов кучи слитых кластеров пересчитывается значение связи, вставляется в кучу выбранного кластера информация о новом кластере, удаляется старое. Сложность &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;. В худшем случае, одна итерация цикла происходит за &amp;lt;math&amp;gt;T_i = O(log(n))&amp;lt;/math&amp;gt;. Количество итераций n - k. Итого: &amp;lt;math&amp;gt;T_5 = O((n - k) * log(n))&amp;lt;/math&amp;gt;. При k = 1, &amp;lt;math&amp;gt;T_5 = O(n * log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Итоговая сложность в худшем случае равна:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;T_1 + T_2 + T_3 + T_4 + T_5 = O(n) + O(n^2) + O(n * log(n)) + O(n * log(n)) + O(n * log(n)) = O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Итоговая сложность в среднем случае равна:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(n * m_a) + O(n * log(n))&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Сложность по времени:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(n * (m_a + log(n)))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Входные данные алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;&lt;br /&gt;
*Целевое количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
*Матрица размера &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt; (n объектов по k признаков)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Гиперпараметры алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Пороговое значение схожести &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt;&lt;br /&gt;
*Функция ожидания количества соседей &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Результат:&#039;&#039;&#039;&lt;br /&gt;
*Метка кластера для каждого объекта&lt;br /&gt;
*Объём данных: &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; меток кластера&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
*Детерменированность алгоритма&lt;br /&gt;
*Отношение последовательной и параллельной сложностей: &amp;lt;math&amp;gt;\frac{O(n^2+nm_m m_\alpha + n^2\log n)}{O(\frac{n^2}{p}+nm_m m_\alpha + \frac{n^2\log n}{p})}&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Вычислительная сложность: &amp;lt;math&amp;gt;\frac{O(n^2+nm_m m_\alpha + n^2\log n)}{2n+2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Divanov</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=20008</id>
		<title>Участник:Иванов Даниил/Алгоритм устойчивой кластеризации с иcпользованием связей</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=20008"/>
		<updated>2016-12-04T10:27:47Z</updated>

		<summary type="html">&lt;p&gt;Divanov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм устойчивой кластеризации с иcпользованием связей&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(n^2 + n m_m m_a + n^2 \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; (n объектов с k признаками)&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (метки кластеров для каждого объекта)&lt;br /&gt;
}}&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
:Алгоритм устойчивой кластеризации с иcпользованием связей (&#039;&#039;&#039;robust clustering using links&#039;&#039;&#039;, &#039;&#039;ROCK&#039;&#039;) решает задачу [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F кластеризации] объектов по заранее заданному количеству &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. В пространстве объектов должна быть определена функция сходства/расстояния между объекта &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;. Данный алгоритм относится к иерархическим методам кластеризации, который начинает с разбиения пространства на большое количество кластеров и постепенно объединяя их до нужного количества. Алгоритм пытается объединить в один кластер точки с максимальным числом общих соседей.&lt;br /&gt;
&lt;br /&gt;
:Данный алгоритм хорошо подходит для объектов с категориальными признаками (то есть признаками, принимающими небольшое количество значений). С помощью этого алгоритма также часто решается задача [https://en.wikipedia.org/wiki/Association_rule_learning поиска ассоциативных правил].&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
:Пусть дано множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;, натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;, пороговое значение &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt; и функция функция &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
:Результатом работы алгоритма является &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; непересекающихся кластеров, делящих множество &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Две точки называются &#039;&#039;соседними&#039;&#039;, если &amp;lt;math&amp;gt;sim(p_i, p_j) \geq \theta&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Количеством общих соседей &amp;lt;math&amp;gt;link(p_i, p_j)&amp;lt;/math&amp;gt; называется число точек, являющимися соседними для точек &amp;lt;math&amp;gt;p_i, p_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией связи между кластерами называется &amp;lt;math&amp;gt;link[C_i, C_j] = \sum_{\begin{smallmatrix}p_q\in C_i,\; p_r\in C_j\end{smallmatrix}}^{ } link(p_{q},p_r)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией качества является функция&lt;br /&gt;
:&amp;lt;math&amp;gt; g(C_i, C_j) = \frac{link[C_i,C_j]}{(n_i + n_j)^{1 + 2f(\theta )} - n_i^{1+2f(\theta )} - n_j^{1+2f(\theta )}}&amp;lt;/math&amp;gt;,  где &amp;lt;math&amp;gt;n_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;n&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
:Затем на каждом шаге он вычисляет значение &amp;lt;math&amp;gt;g(C_i, C_j)&amp;lt;/math&amp;gt; для каждой пары кластеров и объединяет эти кластеры в один.&lt;br /&gt;
:Алгоритм ведёт свою работу до тех пор, пока не получит &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:В качестве функции &amp;lt;math&amp;gt;f( \theta )&amp;lt;/math&amp;gt; обычно используется функция &amp;lt;math&amp;gt;f(\theta ) = \frac{\theta - 1}{\theta + 1}&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;n_i^{1+2f(\theta )}&amp;lt;/math&amp;gt; - ожидаемое число связей между парами объектов кластера &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Если все признаки категориальны, то в качестве функции схожести можно использовать функцию:&lt;br /&gt;
:&amp;lt;math&amp;gt;sim(p_i,p_j) = \frac{|p_i\cap p_j|}{|p_i\cup p_j|}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|p_i|&amp;lt;/math&amp;gt; - количество атрибутов в &amp;lt;math&amp;gt;p_i&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-k&amp;lt;/math&amp;gt; шагов кластеры последовательно объединяются. Реализовывается с помощью структуры данных &#039;&#039;куча&#039;&#039;. Для каждого кластера math&amp;gt;i&amp;lt;/math&amp;gt; хранится своя куча &amp;lt;math&amp;gt;q[i]&amp;lt;/math&amp;gt;, содержащая все связанный с ним кластеры, упорядоченная по убыванию функции качества. Также хранится глобальная куча &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, содержащая все кластеры &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, упорядоченные по мере убывания функции качества &amp;lt;math&amp;gt;g(j, max(q[j]))&amp;lt;/math&amp;gt;. На каждом шаге итерации, после объединения кластеров требуется перестроить кучи объединённых кластеров в одну и перестроить глобальную кучу.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
:Макроструктура состоит из последовательного выполнения двух шагов, описанных в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]]:&lt;br /&gt;
# Построении матрицы связей&lt;br /&gt;
# Пересчёте куч и объединении кластеров&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Описание реализации алгоритма на псевдокоде&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line&amp;gt;&lt;br /&gt;
procedure cluster(S, k)&lt;br /&gt;
begin&lt;br /&gt;
    link := compute_links(S)&lt;br /&gt;
    for s in S do&lt;br /&gt;
    begin&lt;br /&gt;
        q[s] := build_local_heap(link, s)&lt;br /&gt;
    end&lt;br /&gt;
    Q := build_global_heap(S, q)&lt;br /&gt;
    while size(Q) &amp;gt; k do&lt;br /&gt;
    begin&lt;br /&gt;
        u := extract_max(Q)&lt;br /&gt;
        v := max(q[u])&lt;br /&gt;
        delete(Q, v)&lt;br /&gt;
        w := merge(u, v)&lt;br /&gt;
        for each x in q[u] or q[v] do&lt;br /&gt;
        begin&lt;br /&gt;
            link[x, w] := link[x, u] + link[x, v]&lt;br /&gt;
            delete(q[x], u)&lt;br /&gt;
            delete(q[x], v)&lt;br /&gt;
            insert(q[x], w, g(x, w))&lt;br /&gt;
            insert(q[w], x, g(x, w))&lt;br /&gt;
            update(Q, x, q[x])&lt;br /&gt;
        end&lt;br /&gt;
        insert(Q, w, q[w])&lt;br /&gt;
        deallocate(q[u])&lt;br /&gt;
        deallocate(q[v])&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Временная сложность&#039;&#039;&#039;:&lt;br /&gt;
*Инициализация глобальной кучи - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Инициализация локальной кучи - требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Вычисление связей между парой точек - в худшем случае алгоритмом Штрассена вычисляется за &amp;lt;math&amp;gt;O(n*n^{2.37})&amp;lt;/math&amp;gt;, в среднем за &amp;lt;math&amp;gt;O(n m_\alpha m_m)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Построение каждой кучи - &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Сортировка каждой кучи -  &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Основной цикл объединения кластеров выполняется в &amp;lt;math&amp;gt;n-k&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
**Вставить новый кластер в в &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt; локальных куч размера &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt; &lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(n^2 + n m_m m_a + n^2 \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Сложность по памяти&#039;&#039;&#039;:&lt;br /&gt;
*Поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей, то общие затраты памяти не превышают &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Хранение связей - &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt; &#039;&#039;(поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей)&#039;&#039;&lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(\min \{ n^2, n m_m m_a \} )&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:Divanov dia2.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма == &lt;br /&gt;
&lt;br /&gt;
# Вычисление соседей. Затраты данных операций при условии достаточного количества ядер &amp;lt;math&amp;gt;T_1 = O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
# Построения связей происходит в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; этапов, в каждом из которых нужно сделать &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; расчетов(с учетом распараллеливания), где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество соседей. В худшем случае &amp;lt;math&amp;gt;T_2 = O(n^2)&amp;lt;/math&amp;gt; в среднем случае &amp;lt;math&amp;gt;T_2 = O(n * m_a)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_a&amp;lt;/math&amp;gt; среднее ожидаемое число соседей.&lt;br /&gt;
# Построение одной кучи имеет сложность &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;. Для каждой кучи сортировка &amp;lt;math&amp;gt;O(n * log(n))&amp;lt;/math&amp;gt;. Итоговая сложность создания локальных куч &amp;lt;math&amp;gt;T_3 = O(n * log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Построение и сортировка глобальной кучи: &amp;lt;math&amp;gt;T_4 = O(n * log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
# В цикле происходит выбор кластеров, сливание, пересчет и обновление куч. Для всех элементов кучи слитых кластеров пересчитывается значение связи, вставляется в кучу выбранного кластера информация о новом кластере, удаляется старое. Сложность &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;. В худшем случае, одна итерация цикла происходит за &amp;lt;math&amp;gt;T_i = O(log(n))&amp;lt;/math&amp;gt;. Количество итераций n - k. Итого: &amp;lt;math&amp;gt;T_5 = O((n - k) * log(n))&amp;lt;/math&amp;gt;. При k = 1, &amp;lt;math&amp;gt;T_5 = O(n * log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Итоговая сложность в худшем случае равна:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;T_1 + T_2 + T_3 + T_4 + T_5 = O(n) + O(n^2) + O(n * log(n)) + O(n * log(n)) + O(n * log(n)) = O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Итоговая сложность в среднем случае равна:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(n * m_a) + O(n * log(n))&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Сложность по времени:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(n * (m_a + log(n)))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Входные данные алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;&lt;br /&gt;
*Целевое количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Гиперпараметры алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Пороговое значение схожести &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt;&lt;br /&gt;
*Функция ожидания количества соседей &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Результат:&#039;&#039;&#039;&lt;br /&gt;
*Метка кластера для каждого объекта&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
*Детерменированность алгоритма&lt;br /&gt;
*Отношение последовательной и параллельной сложностей: &amp;lt;math&amp;gt;\frac{O(n^2+nm_m m_\alpha + n^2\log n)}{O(\frac{n^2}{p}+nm_m m_\alpha + \frac{n^2\log n}{p})}&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Вычислительная сложность: &amp;lt;math&amp;gt;\frac{O(n^2+nm_m m_\alpha + n^2\log n)}{2n+2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Divanov</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=20007</id>
		<title>Участник:Иванов Даниил/Алгоритм устойчивой кластеризации с иcпользованием связей</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=20007"/>
		<updated>2016-12-04T09:07:01Z</updated>

		<summary type="html">&lt;p&gt;Divanov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм устойчивой кластеризации с иcпользованием связей&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(n^2 + n m_m m_a + n^2 \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt; (n объектов с m аттрибутами каждый)&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (метки кластеров для каждого объекта)&lt;br /&gt;
}}&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
:Алгоритм устойчивой кластеризации с иcпользованием связей (&#039;&#039;&#039;robust clustering using links&#039;&#039;&#039;, &#039;&#039;ROCK&#039;&#039;) решает задачу [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F кластеризации] объектов по заранее заданному количеству &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. В пространстве объектов должна быть определена функция сходства/расстояния между объекта &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;. Данный алгоритм относится к иерархическим методам кластеризации, который начинает с разбиения пространства на большое количество кластеров и постепенно объединяя их до нужного количества. Алгоритм пытается объединить в один кластер точки с максимальным числом общих соседей.&lt;br /&gt;
&lt;br /&gt;
:Данный алгоритм хорошо подходит для объектов с категориальными признаками (то есть признаками, принимающими небольшое количество значений). С помощью этого алгоритма также часто решается задача [https://en.wikipedia.org/wiki/Association_rule_learning поиска ассоциативных правил].&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
:Пусть дано множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;, натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;, пороговое значение &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt; и функция функция &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
:Результатом работы алгоритма является &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; непересекающихся кластеров, делящих множество &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Две точки называются &#039;&#039;соседними&#039;&#039;, если &amp;lt;math&amp;gt;sim(p_i, p_j) \geq \theta&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Количеством общих соседей &amp;lt;math&amp;gt;link(p_i, p_j)&amp;lt;/math&amp;gt; называется число точек, являющимися соседними для точек &amp;lt;math&amp;gt;p_i, p_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией связи между кластерами называется &amp;lt;math&amp;gt;link[C_i, C_j] = \sum_{\begin{smallmatrix}p_q\in C_i,\; p_r\in C_j\end{smallmatrix}}^{ } link(p_{q},p_r)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией качества является функция&lt;br /&gt;
:&amp;lt;math&amp;gt; g(C_i, C_j) = \frac{link[C_i,C_j]}{(n_i + n_j)^{1 + 2f(\theta )} - n_i^{1+2f(\theta )} - n_j^{1+2f(\theta )}}&amp;lt;/math&amp;gt;,  где &amp;lt;math&amp;gt;n_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;n&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
:Затем на каждом шаге он вычисляет значение &amp;lt;math&amp;gt;g(C_i, C_j)&amp;lt;/math&amp;gt; для каждой пары кластеров и объединяет эти кластеры в один.&lt;br /&gt;
:Алгоритм ведёт свою работу до тех пор, пока не получит &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:В качестве функции &amp;lt;math&amp;gt;f( \theta )&amp;lt;/math&amp;gt; обычно используется функция &amp;lt;math&amp;gt;f(\theta ) = \frac{\theta - 1}{\theta + 1}&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;n_i^{1+2f(\theta )}&amp;lt;/math&amp;gt; - ожидаемое число связей между парами объектов кластера &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Если все признаки категориальны, то в качестве функции схожести можно использовать функцию:&lt;br /&gt;
:&amp;lt;math&amp;gt;sim(p_i,p_j) = \frac{|p_i\cap p_j|}{|p_i\cup p_j|}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|p_i|&amp;lt;/math&amp;gt; - количество атрибутов в &amp;lt;math&amp;gt;p_i&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-k&amp;lt;/math&amp;gt; шагов кластеры последовательно объединяются. Реализовывается с помощью структуры данных &#039;&#039;куча&#039;&#039;. Для каждого кластера math&amp;gt;i&amp;lt;/math&amp;gt; хранится своя куча &amp;lt;math&amp;gt;q[i]&amp;lt;/math&amp;gt;, содержащая все связанный с ним кластеры, упорядоченная по убыванию функции качества. Также хранится глобальная куча &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, содержащая все кластеры &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, упорядоченные по мере убывания функции качества &amp;lt;math&amp;gt;g(j, max(q[j]))&amp;lt;/math&amp;gt;. На каждом шаге итерации, после объединения кластеров требуется перестроить кучи объединённых кластеров в одну и перестроить глобальную кучу.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
:Макроструктура состоит из последовательного выполнения двух шагов, описанных в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]]:&lt;br /&gt;
# Построении матрицы связей&lt;br /&gt;
# Пересчёте куч и объединении кластеров&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Описание реализации алгоритма на псевдокоде&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line&amp;gt;&lt;br /&gt;
procedure cluster(S, k)&lt;br /&gt;
begin&lt;br /&gt;
    link := compute_links(S)&lt;br /&gt;
    for s in S do&lt;br /&gt;
    begin&lt;br /&gt;
        q[s] := build_local_heap(link, s)&lt;br /&gt;
    end&lt;br /&gt;
    Q := build_global_heap(S, q)&lt;br /&gt;
    while size(Q) &amp;gt; k do&lt;br /&gt;
    begin&lt;br /&gt;
        u := extract_max(Q)&lt;br /&gt;
        v := max(q[u])&lt;br /&gt;
        delete(Q, v)&lt;br /&gt;
        w := merge(u, v)&lt;br /&gt;
        for each x in q[u] or q[v] do&lt;br /&gt;
        begin&lt;br /&gt;
            link[x, w] := link[x, u] + link[x, v]&lt;br /&gt;
            delete(q[x], u)&lt;br /&gt;
            delete(q[x], v)&lt;br /&gt;
            insert(q[x], w, g(x, w))&lt;br /&gt;
            insert(q[w], x, g(x, w))&lt;br /&gt;
            update(Q, x, q[x])&lt;br /&gt;
        end&lt;br /&gt;
        insert(Q, w, q[w])&lt;br /&gt;
        deallocate(q[u])&lt;br /&gt;
        deallocate(q[v])&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Временная сложность&#039;&#039;&#039;:&lt;br /&gt;
*Инициализация глобальной кучи - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Инициализация локальной кучи - требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Вычисление связей между парой точек - в худшем случае алгоритмом Штрассена вычисляется за &amp;lt;math&amp;gt;O(n*n^{2.37})&amp;lt;/math&amp;gt;, в среднем за &amp;lt;math&amp;gt;O(n m_\alpha m_m)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Построение каждой кучи - &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Сортировка каждой кучи -  &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Основной цикл объединения кластеров выполняется в &amp;lt;math&amp;gt;n-k&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
**Вставить новый кластер в в &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt; локальных куч размера &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt; &lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(n^2 + n m_m m_a + n^2 \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Сложность по памяти&#039;&#039;&#039;:&lt;br /&gt;
*Поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей, то общие затраты памяти не превышают &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Хранение связей - &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt; &#039;&#039;(поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей)&#039;&#039;&lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(\min \{ n^2, n m_m m_a \} )&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:Divanov dia2.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма == &lt;br /&gt;
&lt;br /&gt;
# Вычисление соседей. Затраты данных операций при условии достаточного количества ядер &amp;lt;math&amp;gt;T_1 = O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
# Построения связей происходит в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; этапов, в каждом из которых нужно сделать &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; расчетов(с учетом распараллеливания), где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество соседей. В худшем случае &amp;lt;math&amp;gt;T_2 = O(n^2)&amp;lt;/math&amp;gt; в среднем случае &amp;lt;math&amp;gt;T_2 = O(n * m_a)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_a&amp;lt;/math&amp;gt; среднее ожидаемое число соседей.&lt;br /&gt;
# Построение одной кучи имеет сложность &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;. Для каждой кучи сортировка &amp;lt;math&amp;gt;O(n * log(n))&amp;lt;/math&amp;gt;. Итоговая сложность создания локальных куч &amp;lt;math&amp;gt;T_3 = O(n * log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Построение и сортировка глобальной кучи: &amp;lt;math&amp;gt;T_4 = O(n * log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
# В цикле происходит выбор кластеров, сливание, пересчет и обновление куч. Для всех элементов кучи слитых кластеров пересчитывается значение связи, вставляется в кучу выбранного кластера информация о новом кластере, удаляется старое. Сложность &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;. В худшем случае, одна итерация цикла происходит за &amp;lt;math&amp;gt;T_i = O(log(n))&amp;lt;/math&amp;gt;. Количество итераций n - k. Итого: &amp;lt;math&amp;gt;T_5 = O((n - k) * log(n))&amp;lt;/math&amp;gt;. При k = 1, &amp;lt;math&amp;gt;T_5 = O(n * log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Итоговая сложность в худшем случае равна:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;T_1 + T_2 + T_3 + T_4 + T_5 = O(n) + O(n^2) + O(n * log(n)) + O(n * log(n)) + O(n * log(n)) = O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Итоговая сложность в среднем случае равна:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(n * m_a) + O(n * log(n))&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Сложность по времени:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(n * (m_a + log(n)))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Входные данные алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;&lt;br /&gt;
*Целевое количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Гиперпараметры алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Пороговое значение схожести &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt;&lt;br /&gt;
*Функция ожидания количества соседей &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Результат:&#039;&#039;&#039;&lt;br /&gt;
*Метка кластера для каждого объекта&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
*Детерменированность алгоритма&lt;br /&gt;
*Отношение последовательной и параллельной сложностей: &amp;lt;math&amp;gt;\frac{O(n^2+nm_m m_\alpha + n^2\log n)}{O(\frac{n^2}{p}+nm_m m_\alpha + \frac{n^2\log n}{p})}&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Вычислительная сложность: &amp;lt;math&amp;gt;\frac{O(n^2+nm_m m_\alpha + n^2\log n)}{2n+2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Divanov</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=20006</id>
		<title>Участник:Иванов Даниил/Алгоритм устойчивой кластеризации с иcпользованием связей</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=20006"/>
		<updated>2016-12-04T09:05:16Z</updated>

		<summary type="html">&lt;p&gt;Divanov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм устойчивой кластеризации с иcпользованием связей&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(n^2 + n m_m m_a + n^2 \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
:Алгоритм устойчивой кластеризации с иcпользованием связей (&#039;&#039;&#039;robust clustering using links&#039;&#039;&#039;, &#039;&#039;ROCK&#039;&#039;) решает задачу [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F кластеризации] объектов по заранее заданному количеству &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. В пространстве объектов должна быть определена функция сходства/расстояния между объекта &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;. Данный алгоритм относится к иерархическим методам кластеризации, который начинает с разбиения пространства на большое количество кластеров и постепенно объединяя их до нужного количества. Алгоритм пытается объединить в один кластер точки с максимальным числом общих соседей.&lt;br /&gt;
&lt;br /&gt;
:Данный алгоритм хорошо подходит для объектов с категориальными признаками (то есть признаками, принимающими небольшое количество значений). С помощью этого алгоритма также часто решается задача [https://en.wikipedia.org/wiki/Association_rule_learning поиска ассоциативных правил].&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
:Пусть дано множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;, натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;, пороговое значение &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt; и функция функция &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
:Результатом работы алгоритма является &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; непересекающихся кластеров, делящих множество &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Две точки называются &#039;&#039;соседними&#039;&#039;, если &amp;lt;math&amp;gt;sim(p_i, p_j) \geq \theta&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Количеством общих соседей &amp;lt;math&amp;gt;link(p_i, p_j)&amp;lt;/math&amp;gt; называется число точек, являющимися соседними для точек &amp;lt;math&amp;gt;p_i, p_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией связи между кластерами называется &amp;lt;math&amp;gt;link[C_i, C_j] = \sum_{\begin{smallmatrix}p_q\in C_i,\; p_r\in C_j\end{smallmatrix}}^{ } link(p_{q},p_r)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией качества является функция&lt;br /&gt;
:&amp;lt;math&amp;gt; g(C_i, C_j) = \frac{link[C_i,C_j]}{(n_i + n_j)^{1 + 2f(\theta )} - n_i^{1+2f(\theta )} - n_j^{1+2f(\theta )}}&amp;lt;/math&amp;gt;,  где &amp;lt;math&amp;gt;n_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;n&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
:Затем на каждом шаге он вычисляет значение &amp;lt;math&amp;gt;g(C_i, C_j)&amp;lt;/math&amp;gt; для каждой пары кластеров и объединяет эти кластеры в один.&lt;br /&gt;
:Алгоритм ведёт свою работу до тех пор, пока не получит &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:В качестве функции &amp;lt;math&amp;gt;f( \theta )&amp;lt;/math&amp;gt; обычно используется функция &amp;lt;math&amp;gt;f(\theta ) = \frac{\theta - 1}{\theta + 1}&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;n_i^{1+2f(\theta )}&amp;lt;/math&amp;gt; - ожидаемое число связей между парами объектов кластера &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Если все признаки категориальны, то в качестве функции схожести можно использовать функцию:&lt;br /&gt;
:&amp;lt;math&amp;gt;sim(p_i,p_j) = \frac{|p_i\cap p_j|}{|p_i\cup p_j|}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|p_i|&amp;lt;/math&amp;gt; - количество атрибутов в &amp;lt;math&amp;gt;p_i&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-k&amp;lt;/math&amp;gt; шагов кластеры последовательно объединяются. Реализовывается с помощью структуры данных &#039;&#039;куча&#039;&#039;. Для каждого кластера math&amp;gt;i&amp;lt;/math&amp;gt; хранится своя куча &amp;lt;math&amp;gt;q[i]&amp;lt;/math&amp;gt;, содержащая все связанный с ним кластеры, упорядоченная по убыванию функции качества. Также хранится глобальная куча &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, содержащая все кластеры &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, упорядоченные по мере убывания функции качества &amp;lt;math&amp;gt;g(j, max(q[j]))&amp;lt;/math&amp;gt;. На каждом шаге итерации, после объединения кластеров требуется перестроить кучи объединённых кластеров в одну и перестроить глобальную кучу.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
:Макроструктура состоит из последовательного выполнения двух шагов, описанных в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]]:&lt;br /&gt;
# Построении матрицы связей&lt;br /&gt;
# Пересчёте куч и объединении кластеров&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Описание реализации алгоритма на псевдокоде&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line&amp;gt;&lt;br /&gt;
procedure cluster(S, k)&lt;br /&gt;
begin&lt;br /&gt;
    link := compute_links(S)&lt;br /&gt;
    for s in S do&lt;br /&gt;
    begin&lt;br /&gt;
        q[s] := build_local_heap(link, s)&lt;br /&gt;
    end&lt;br /&gt;
    Q := build_global_heap(S, q)&lt;br /&gt;
    while size(Q) &amp;gt; k do&lt;br /&gt;
    begin&lt;br /&gt;
        u := extract_max(Q)&lt;br /&gt;
        v := max(q[u])&lt;br /&gt;
        delete(Q, v)&lt;br /&gt;
        w := merge(u, v)&lt;br /&gt;
        for each x in q[u] or q[v] do&lt;br /&gt;
        begin&lt;br /&gt;
            link[x, w] := link[x, u] + link[x, v]&lt;br /&gt;
            delete(q[x], u)&lt;br /&gt;
            delete(q[x], v)&lt;br /&gt;
            insert(q[x], w, g(x, w))&lt;br /&gt;
            insert(q[w], x, g(x, w))&lt;br /&gt;
            update(Q, x, q[x])&lt;br /&gt;
        end&lt;br /&gt;
        insert(Q, w, q[w])&lt;br /&gt;
        deallocate(q[u])&lt;br /&gt;
        deallocate(q[v])&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Временная сложность&#039;&#039;&#039;:&lt;br /&gt;
*Инициализация глобальной кучи - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Инициализация локальной кучи - требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Вычисление связей между парой точек - в худшем случае алгоритмом Штрассена вычисляется за &amp;lt;math&amp;gt;O(n*n^{2.37})&amp;lt;/math&amp;gt;, в среднем за &amp;lt;math&amp;gt;O(n m_\alpha m_m)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Построение каждой кучи - &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Сортировка каждой кучи -  &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Основной цикл объединения кластеров выполняется в &amp;lt;math&amp;gt;n-k&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
**Вставить новый кластер в в &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt; локальных куч размера &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt; &lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(n^2 + n m_m m_a + n^2 \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Сложность по памяти&#039;&#039;&#039;:&lt;br /&gt;
*Поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей, то общие затраты памяти не превышают &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Хранение связей - &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt; &#039;&#039;(поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей)&#039;&#039;&lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(\min \{ n^2, n m_m m_a \} )&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:Divanov dia2.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма == &lt;br /&gt;
&lt;br /&gt;
# Вычисление соседей. Затраты данных операций при условии достаточного количества ядер &amp;lt;math&amp;gt;T_1 = O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
# Построения связей происходит в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; этапов, в каждом из которых нужно сделать &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; расчетов(с учетом распараллеливания), где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество соседей. В худшем случае &amp;lt;math&amp;gt;T_2 = O(n^2)&amp;lt;/math&amp;gt; в среднем случае &amp;lt;math&amp;gt;T_2 = O(n * m_a)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_a&amp;lt;/math&amp;gt; среднее ожидаемое число соседей.&lt;br /&gt;
# Построение одной кучи имеет сложность &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;. Для каждой кучи сортировка &amp;lt;math&amp;gt;O(n * log(n))&amp;lt;/math&amp;gt;. Итоговая сложность создания локальных куч &amp;lt;math&amp;gt;T_3 = O(n * log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Построение и сортировка глобальной кучи: &amp;lt;math&amp;gt;T_4 = O(n * log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
# В цикле происходит выбор кластеров, сливание, пересчет и обновление куч. Для всех элементов кучи слитых кластеров пересчитывается значение связи, вставляется в кучу выбранного кластера информация о новом кластере, удаляется старое. Сложность &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;. В худшем случае, одна итерация цикла происходит за &amp;lt;math&amp;gt;T_i = O(log(n))&amp;lt;/math&amp;gt;. Количество итераций n - k. Итого: &amp;lt;math&amp;gt;T_5 = O((n - k) * log(n))&amp;lt;/math&amp;gt;. При k = 1, &amp;lt;math&amp;gt;T_5 = O(n * log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Итоговая сложность в худшем случае равна:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;T_1 + T_2 + T_3 + T_4 + T_5 = O(n) + O(n^2) + O(n * log(n)) + O(n * log(n)) + O(n * log(n)) = O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Итоговая сложность в среднем случае равна:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(n * m_a) + O(n * log(n))&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Сложность по времени:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(n * (m_a + log(n)))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Входные данные алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;&lt;br /&gt;
*Целевое количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Гиперпараметры алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Пороговое значение схожести &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt;&lt;br /&gt;
*Функция ожидания количества соседей &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Результат:&#039;&#039;&#039;&lt;br /&gt;
*Метка кластера для каждого объекта&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
*Детерменированность алгоритма&lt;br /&gt;
*Отношение последовательной и параллельной сложностей: &amp;lt;math&amp;gt;\frac{O(n^2+nm_m m_\alpha + n^2\log n)}{O(\frac{n^2}{p}+nm_m m_\alpha + \frac{n^2\log n}{p})}&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Вычислительная сложность: &amp;lt;math&amp;gt;\frac{O(n^2+nm_m m_\alpha + n^2\log n)}{2n+2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Divanov</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=20005</id>
		<title>Участник:Иванов Даниил/Алгоритм устойчивой кластеризации с иcпользованием связей</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=20005"/>
		<updated>2016-12-04T09:00:21Z</updated>

		<summary type="html">&lt;p&gt;Divanov: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм устойчивой кластеризации с иcпользованием связей&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
:Алгоритм устойчивой кластеризации с иcпользованием связей (&#039;&#039;&#039;robust clustering using links&#039;&#039;&#039;, &#039;&#039;ROCK&#039;&#039;) решает задачу [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F кластеризации] объектов по заранее заданному количеству &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. В пространстве объектов должна быть определена функция сходства/расстояния между объекта &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;. Данный алгоритм относится к иерархическим методам кластеризации, который начинает с разбиения пространства на большое количество кластеров и постепенно объединяя их до нужного количества. Алгоритм пытается объединить в один кластер точки с максимальным числом общих соседей.&lt;br /&gt;
&lt;br /&gt;
:Данный алгоритм хорошо подходит для объектов с категориальными признаками (то есть признаками, принимающими небольшое количество значений). С помощью этого алгоритма также часто решается задача [https://en.wikipedia.org/wiki/Association_rule_learning поиска ассоциативных правил].&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
:Пусть дано множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;, натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;, пороговое значение &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt; и функция функция &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
:Результатом работы алгоритма является &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; непересекающихся кластеров, делящих множество &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Две точки называются &#039;&#039;соседними&#039;&#039;, если &amp;lt;math&amp;gt;sim(p_i, p_j) \geq \theta&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Количеством общих соседей &amp;lt;math&amp;gt;link(p_i, p_j)&amp;lt;/math&amp;gt; называется число точек, являющимися соседними для точек &amp;lt;math&amp;gt;p_i, p_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией связи между кластерами называется &amp;lt;math&amp;gt;link[C_i, C_j] = \sum_{\begin{smallmatrix}p_q\in C_i,\; p_r\in C_j\end{smallmatrix}}^{ } link(p_{q},p_r)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией качества является функция&lt;br /&gt;
:&amp;lt;math&amp;gt; g(C_i, C_j) = \frac{link[C_i,C_j]}{(n_i + n_j)^{1 + 2f(\theta )} - n_i^{1+2f(\theta )} - n_j^{1+2f(\theta )}}&amp;lt;/math&amp;gt;,  где &amp;lt;math&amp;gt;n_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;n&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
:Затем на каждом шаге он вычисляет значение &amp;lt;math&amp;gt;g(C_i, C_j)&amp;lt;/math&amp;gt; для каждой пары кластеров и объединяет эти кластеры в один.&lt;br /&gt;
:Алгоритм ведёт свою работу до тех пор, пока не получит &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:В качестве функции &amp;lt;math&amp;gt;f( \theta )&amp;lt;/math&amp;gt; обычно используется функция &amp;lt;math&amp;gt;f(\theta ) = \frac{\theta - 1}{\theta + 1}&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;n_i^{1+2f(\theta )}&amp;lt;/math&amp;gt; - ожидаемое число связей между парами объектов кластера &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Если все признаки категориальны, то в качестве функции схожести можно использовать функцию:&lt;br /&gt;
:&amp;lt;math&amp;gt;sim(p_i,p_j) = \frac{|p_i\cap p_j|}{|p_i\cup p_j|}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|p_i|&amp;lt;/math&amp;gt; - количество атрибутов в &amp;lt;math&amp;gt;p_i&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-k&amp;lt;/math&amp;gt; шагов кластеры последовательно объединяются. Реализовывается с помощью структуры данных &#039;&#039;куча&#039;&#039;. Для каждого кластера math&amp;gt;i&amp;lt;/math&amp;gt; хранится своя куча &amp;lt;math&amp;gt;q[i]&amp;lt;/math&amp;gt;, содержащая все связанный с ним кластеры, упорядоченная по убыванию функции качества. Также хранится глобальная куча &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, содержащая все кластеры &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, упорядоченные по мере убывания функции качества &amp;lt;math&amp;gt;g(j, max(q[j]))&amp;lt;/math&amp;gt;. На каждом шаге итерации, после объединения кластеров требуется перестроить кучи объединённых кластеров в одну и перестроить глобальную кучу.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
:Макроструктура состоит из последовательного выполнения двух шагов, описанных в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]]:&lt;br /&gt;
# Построении матрицы связей&lt;br /&gt;
# Пересчёте куч и объединении кластеров&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Описание реализации алгоритма на псевдокоде&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line&amp;gt;&lt;br /&gt;
procedure cluster(S, k)&lt;br /&gt;
begin&lt;br /&gt;
    link := compute_links(S)&lt;br /&gt;
    for s in S do&lt;br /&gt;
    begin&lt;br /&gt;
        q[s] := build_local_heap(link, s)&lt;br /&gt;
    end&lt;br /&gt;
    Q := build_global_heap(S, q)&lt;br /&gt;
    while size(Q) &amp;gt; k do&lt;br /&gt;
    begin&lt;br /&gt;
        u := extract_max(Q)&lt;br /&gt;
        v := max(q[u])&lt;br /&gt;
        delete(Q, v)&lt;br /&gt;
        w := merge(u, v)&lt;br /&gt;
        for each x in q[u] or q[v] do&lt;br /&gt;
        begin&lt;br /&gt;
            link[x, w] := link[x, u] + link[x, v]&lt;br /&gt;
            delete(q[x], u)&lt;br /&gt;
            delete(q[x], v)&lt;br /&gt;
            insert(q[x], w, g(x, w))&lt;br /&gt;
            insert(q[w], x, g(x, w))&lt;br /&gt;
            update(Q, x, q[x])&lt;br /&gt;
        end&lt;br /&gt;
        insert(Q, w, q[w])&lt;br /&gt;
        deallocate(q[u])&lt;br /&gt;
        deallocate(q[v])&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Временная сложность&#039;&#039;&#039;:&lt;br /&gt;
*Инициализация глобальной кучи - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Инициализация локальной кучи - требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Вычисление связей между парой точек - в худшем случае алгоритмом Штрассена вычисляется за &amp;lt;math&amp;gt;O(n*n^{2.37})&amp;lt;/math&amp;gt;, в среднем за &amp;lt;math&amp;gt;O(n m_\alpha m_m)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Построение каждой кучи - &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Сортировка каждой кучи -  &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Основной цикл объединения кластеров выполняется в &amp;lt;math&amp;gt;n-k&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
**Вставить новый кластер в в &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt; локальных куч размера &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt; &lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(n^2 + n m_m m_a + n^2 \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Сложность по памяти&#039;&#039;&#039;:&lt;br /&gt;
*Поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей, то общие затраты памяти не превышают &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Хранение связей - &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt; &#039;&#039;(поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей)&#039;&#039;&lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(\min \{ n^2, n m_m m_a \} )&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:Divanov dia2.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма == &lt;br /&gt;
&lt;br /&gt;
# Вычисление соседей. Затраты данных операций при условии достаточного количества ядер &amp;lt;math&amp;gt;T_1 = O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
# Построения связей происходит в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; этапов, в каждом из которых нужно сделать &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; расчетов(с учетом распараллеливания), где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество соседей. В худшем случае &amp;lt;math&amp;gt;T_2 = O(n^2)&amp;lt;/math&amp;gt; в среднем случае &amp;lt;math&amp;gt;T_2 = O(n * m_a)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_a&amp;lt;/math&amp;gt; среднее ожидаемое число соседей.&lt;br /&gt;
# Построение одной кучи имеет сложность &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;. Для каждой кучи сортировка &amp;lt;math&amp;gt;O(n * log(n))&amp;lt;/math&amp;gt;. Итоговая сложность создания локальных куч &amp;lt;math&amp;gt;T_3 = O(n * log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Построение и сортировка глобальной кучи: &amp;lt;math&amp;gt;T_4 = O(n * log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
# В цикле происходит выбор кластеров, сливание, пересчет и обновление куч. Для всех элементов кучи слитых кластеров пересчитывается значение связи, вставляется в кучу выбранного кластера информация о новом кластере, удаляется старое. Сложность &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;. В худшем случае, одна итерация цикла происходит за &amp;lt;math&amp;gt;T_i = O(log(n))&amp;lt;/math&amp;gt;. Количество итераций n - k. Итого: &amp;lt;math&amp;gt;T_5 = O((n - k) * log(n))&amp;lt;/math&amp;gt;. При k = 1, &amp;lt;math&amp;gt;T_5 = O(n * log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Итоговая сложность в худшем случае равна:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;T_1 + T_2 + T_3 + T_4 + T_5 = O(n) + O(n^2) + O(n * log(n)) + O(n * log(n)) + O(n * log(n)) = O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Итоговая сложность в среднем случае равна:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(n * m_a) + O(n * log(n))&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Сложность по времени:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(n * (m_a + log(n)))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Входные данные алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;&lt;br /&gt;
*Целевое количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Гиперпараметры алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Пороговое значение схожести &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt;&lt;br /&gt;
*Функция ожидания количества соседей &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Результат:&#039;&#039;&#039;&lt;br /&gt;
*Метка кластера для каждого объекта&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
*Детерменированность алгоритма&lt;br /&gt;
*Отношение последовательной и параллельной сложностей: &amp;lt;math&amp;gt;\frac{O(n^2+nm_m m_\alpha + n^2\log n)}{O(\frac{n^2}{p}+nm_m m_\alpha + \frac{n^2\log n}{p})}&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Вычислительная сложность: &amp;lt;math&amp;gt;\frac{O(n^2+nm_m m_\alpha + n^2\log n)}{2n+2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Divanov</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=20004</id>
		<title>Участник:Иванов Даниил/Алгоритм устойчивой кластеризации с иcпользованием связей</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=20004"/>
		<updated>2016-12-04T08:42:48Z</updated>

		<summary type="html">&lt;p&gt;Divanov: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм устойчивой кластеризации с иcпользованием связей&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
:Алгоритм устойчивой кластеризации с иcпользованием связей (&#039;&#039;&#039;robust clustering using links&#039;&#039;&#039;, &#039;&#039;ROCK&#039;&#039;) решает задачу [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F кластеризации] объектов по заранее заданному количеству &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. В пространстве объектов должна быть определена функция сходства/расстояния между объекта &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;. Данный алгоритм относится к иерархическим методам кластеризации, который начинает с разбиения пространства на большое количество кластеров и постепенно объединяя их до нужного количества. Алгоритм пытается объединить в один кластер точки с максимальным числом общих соседей.&lt;br /&gt;
&lt;br /&gt;
:Данный алгоритм хорошо подходит для объектов с категориальными признаками (то есть признаками, принимающими небольшое количество значений). С помощью этого алгоритма также часто решается задача [https://en.wikipedia.org/wiki/Association_rule_learning поиска ассоциативных правил].&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
:Пусть дано множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;, натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;, пороговое значение &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt; и функция функция &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
:Результатом работы алгоритма является &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; непересекающихся кластеров, делящих множество &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Две точки называются &#039;&#039;соседними&#039;&#039;, если &amp;lt;math&amp;gt;sim(p_i, p_j) \geq \theta&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Количеством общих соседей &amp;lt;math&amp;gt;link(p_i, p_j)&amp;lt;/math&amp;gt; называется число точек, являющимися соседними для точек &amp;lt;math&amp;gt;p_i, p_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией связи между кластерами называется &amp;lt;math&amp;gt;link[C_i, C_j] = \sum_{\begin{smallmatrix}p_q\in C_i,\; p_r\in C_j\end{smallmatrix}}^{ } link(p_{q},p_r)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией качества является функция&lt;br /&gt;
:&amp;lt;math&amp;gt; g(C_i, C_j) = \frac{link[C_i,C_j]}{(n_i + n_j)^{1 + 2f(\theta )} - n_i^{1+2f(\theta )} - n_j^{1+2f(\theta )}}&amp;lt;/math&amp;gt;,  где &amp;lt;math&amp;gt;n_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;n&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
:Затем на каждом шаге он вычисляет значение &amp;lt;math&amp;gt;g(C_i, C_j)&amp;lt;/math&amp;gt; для каждой пары кластеров и объединяет эти кластеры в один.&lt;br /&gt;
:Алгоритм ведёт свою работу до тех пор, пока не получит &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:В качестве функции &amp;lt;math&amp;gt;f( \theta )&amp;lt;/math&amp;gt; обычно используется функция &amp;lt;math&amp;gt;f(\theta ) = \frac{\theta - 1}{\theta + 1}&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;n_i^{1+2f(\theta )}&amp;lt;/math&amp;gt; - ожидаемое число связей между парами объектов кластера &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Если все признаки категориальны, то в качестве функции схожести можно использовать функцию:&lt;br /&gt;
:&amp;lt;math&amp;gt;sim(p_i,p_j) = \frac{|p_i\cap p_j|}{|p_i\cup p_j|}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|p_i|&amp;lt;/math&amp;gt; - количество атрибутов в &amp;lt;math&amp;gt;p_i&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-k&amp;lt;/math&amp;gt; шагов кластеры последовательно объединяются. Реализовывается с помощью структуры данных &#039;&#039;куча&#039;&#039;. Для каждого кластера math&amp;gt;i&amp;lt;/math&amp;gt; хранится своя куча &amp;lt;math&amp;gt;q[i]&amp;lt;/math&amp;gt;, содержащая все связанный с ним кластеры, упорядоченная по убыванию функции качества. Также хранится глобальная куча &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, содержащая все кластеры &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, упорядоченные по мере убывания функции качества &amp;lt;math&amp;gt;g(j, max(q[j]))&amp;lt;/math&amp;gt;. На каждом шаге итерации, после объединения кластеров требуется перестроить кучи объединённых кластеров в одну и перестроить глобальную кучу.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
:Макроструктура состоит из последовательного выполнения двух шагов, описанных в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]]:&lt;br /&gt;
# Построении матрицы связей&lt;br /&gt;
# Пересчёте куч и объединении кластеров&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Описание реализации алгоритма на псевдокоде&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line&amp;gt;&lt;br /&gt;
procedure cluster(S, k)&lt;br /&gt;
begin&lt;br /&gt;
    link := compute_links(S)&lt;br /&gt;
    for s in S do&lt;br /&gt;
    begin&lt;br /&gt;
        q[s] := build_local_heap(link, s)&lt;br /&gt;
    end&lt;br /&gt;
    Q := build_global_heap(S, q)&lt;br /&gt;
    while size(Q) &amp;gt; k do&lt;br /&gt;
    begin&lt;br /&gt;
        u := extract_max(Q)&lt;br /&gt;
        v := max(q[u])&lt;br /&gt;
        delete(Q, v)&lt;br /&gt;
        w := merge(u, v)&lt;br /&gt;
        for each x in q[u] or q[v] do&lt;br /&gt;
        begin&lt;br /&gt;
            link[x, w] := link[x, u] + link[x, v]&lt;br /&gt;
            delete(q[x], u)&lt;br /&gt;
            delete(q[x], v)&lt;br /&gt;
            insert(q[x], w, g(x, w))&lt;br /&gt;
            insert(q[w], x, g(x, w))&lt;br /&gt;
            update(Q, x, q[x])&lt;br /&gt;
        end&lt;br /&gt;
        insert(Q, w, q[w])&lt;br /&gt;
        deallocate(q[u])&lt;br /&gt;
        deallocate(q[v])&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Временная сложность&#039;&#039;&#039;:&lt;br /&gt;
*Инициализация глобальной кучи - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Инициализация локальной кучи - требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Вычисление связей между парой точек - в худшем случае алгоритмом Штрассена вычисляется за &amp;lt;math&amp;gt;O(n*n^{2.37})&amp;lt;/math&amp;gt;, в среднем за &amp;lt;math&amp;gt;O(n m_\alpha m_m)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Построение каждой кучи - &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Сортировка каждой кучи -  &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Основной цикл объединения кластеров выполняется в &amp;lt;math&amp;gt;n-k&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
**Вставить новый кластер в в &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt; локальных куч размера &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt; &lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(n^2 + n m_m m_a + n^2 \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Сложность по памяти&#039;&#039;&#039;:&lt;br /&gt;
*Поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей, то общие затраты памяти не превышают &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Хранение связей - &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt; &#039;&#039;(поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей)&#039;&#039;&lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(\min \{ n^2, n m_m m_a \} )&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:Divanov dia2.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма == &lt;br /&gt;
:При &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - количество процессов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{n^2}{p}+nm_m m_\alpha + \frac{n^2\log n}{p})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Входные данные алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;&lt;br /&gt;
*Целевое количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Гиперпараметры алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Пороговое значение схожести &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt;&lt;br /&gt;
*Функция ожидания количества соседей &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Результат:&#039;&#039;&#039;&lt;br /&gt;
*Метка кластера для каждого объекта&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
*Детерменированность алгоритма&lt;br /&gt;
*Отношение последовательной и параллельной сложностей: &amp;lt;math&amp;gt;\frac{O(n^2+nm_m m_\alpha + n^2\log n)}{O(\frac{n^2}{p}+nm_m m_\alpha + \frac{n^2\log n}{p})}&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Вычислительная сложность: &amp;lt;math&amp;gt;\frac{O(n^2+nm_m m_\alpha + n^2\log n)}{2n+2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Divanov</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=20003</id>
		<title>Участник:Иванов Даниил/Алгоритм устойчивой кластеризации с иcпользованием связей</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=20003"/>
		<updated>2016-12-04T08:38:37Z</updated>

		<summary type="html">&lt;p&gt;Divanov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм устойчивой кластеризации с иcпользованием связей&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
:Алгоритм устойчивой кластеризации с иcпользованием связей (&#039;&#039;&#039;robust clustering using links&#039;&#039;&#039;, &#039;&#039;ROCK&#039;&#039;) решает задачу [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F кластеризации] объектов по заранее заданному количеству &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. В пространстве объектов должна быть определена функция сходства/расстояния между объекта &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;. Данный алгоритм относится к иерархическим методам кластеризации, который начинает с разбиения пространства на большое количество кластеров и постепенно объединяя их до нужного количества. Алгоритм пытается объединить в один кластер точки с максимальным числом общих соседей.&lt;br /&gt;
&lt;br /&gt;
:Данный алгоритм хорошо подходит для объектов с категориальными признаками (то есть признаками, принимающими небольшое количество значений). С помощью этого алгоритма также часто решается задача [https://en.wikipedia.org/wiki/Association_rule_learning поиска ассоциативных правил].&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
:Пусть дано множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;, натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;, пороговое значение &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt; и функция функция &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
:Результатом работы алгоритма является &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; непересекающихся кластеров, делящих множество &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Две точки называются &#039;&#039;соседними&#039;&#039;, если &amp;lt;math&amp;gt;sim(p_i, p_j) \geq \theta&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Количеством общих соседей &amp;lt;math&amp;gt;link(p_i, p_j)&amp;lt;/math&amp;gt; называется число точек, являющимися соседними для точек &amp;lt;math&amp;gt;p_i, p_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией связи между кластерами называется &amp;lt;math&amp;gt;link[C_i, C_j] = \sum_{\begin{smallmatrix}p_q\in C_i,\; p_r\in C_j\end{smallmatrix}}^{ } link(p_{q},p_r)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией качества является функция&lt;br /&gt;
:&amp;lt;math&amp;gt; g(C_i, C_j) = \frac{link[C_i,C_j]}{(n_i + n_j)^{1 + 2f(\theta )} - n_i^{1+2f(\theta )} - n_j^{1+2f(\theta )}}&amp;lt;/math&amp;gt;,  где &amp;lt;math&amp;gt;n_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;n&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
:Затем на каждом шаге он вычисляет значение &amp;lt;math&amp;gt;g(C_i, C_j)&amp;lt;/math&amp;gt; для каждой пары кластеров и объединяет эти кластеры в один.&lt;br /&gt;
:Алгоритм ведёт свою работу до тех пор, пока не получит &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:В качестве функции &amp;lt;math&amp;gt;f( \theta )&amp;lt;/math&amp;gt; обычно используется функция &amp;lt;math&amp;gt;f(\theta ) = \frac{\theta - 1}{\theta + 1}&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;n_i^{1+2f(\theta )}&amp;lt;/math&amp;gt; - ожидаемое число связей между парами объектов кластера &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Если все признаки категориальны, то в качестве функции схожести можно использовать функцию:&lt;br /&gt;
:&amp;lt;math&amp;gt;sim(p_i,p_j) = \frac{|p_i\cap p_j|}{|p_i\cup p_j|}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|p_i|&amp;lt;/math&amp;gt; - количество атрибутов в &amp;lt;math&amp;gt;p_i&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-k&amp;lt;/math&amp;gt; шагов кластеры последовательно объединяются. Реализовывается с помощью структуры данных &#039;&#039;куча&#039;&#039;. Для каждого кластера math&amp;gt;i&amp;lt;/math&amp;gt; хранится своя куча &amp;lt;math&amp;gt;q[i]&amp;lt;/math&amp;gt;, содержащая все связанный с ним кластеры, упорядоченная по убыванию функции качества. Также хранится глобальная куча &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, содержащая все кластеры &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, упорядоченные по мере убывания функции качества &amp;lt;math&amp;gt;g(j, max(q[j]))&amp;lt;/math&amp;gt;. На каждом шаге итерации, после объединения кластеров требуется перестроить кучи объединённых кластеров в одну и перестроить глобальную кучу.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
:Макроструктура состоит из последовательного выполнения двух шагов, описанных в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]]:&lt;br /&gt;
# Построении матрицы связей&lt;br /&gt;
# Пересчёте куч и объединении кластеров&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация основной вычислительной части:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line&amp;gt;&lt;br /&gt;
procedure cluster(S, k)&lt;br /&gt;
begin&lt;br /&gt;
    link := compute_links(S)&lt;br /&gt;
    for s in S do&lt;br /&gt;
    begin&lt;br /&gt;
        q[s] := build_local_heap(link, s)&lt;br /&gt;
    end&lt;br /&gt;
    Q := build_global_heap(S, q)&lt;br /&gt;
    while size(Q) &amp;gt; k do&lt;br /&gt;
    begin&lt;br /&gt;
        u := extract_max(Q)&lt;br /&gt;
        v := max(q[u])&lt;br /&gt;
        delete(Q, v)&lt;br /&gt;
        w := merge(u, v)&lt;br /&gt;
        for each x in q[u] or q[v] do&lt;br /&gt;
        begin&lt;br /&gt;
            link[x, w] := link[x, u] + link[x, v]&lt;br /&gt;
            delete(q[x], u)&lt;br /&gt;
            delete(q[x], v)&lt;br /&gt;
            insert(q[x], w, g(x, w))&lt;br /&gt;
            insert(q[w], x, g(x, w))&lt;br /&gt;
            update(Q, x, q[x])&lt;br /&gt;
        end&lt;br /&gt;
        insert(Q, w, q[w])&lt;br /&gt;
        deallocate(q[u])&lt;br /&gt;
        deallocate(q[v])&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Временная сложность&#039;&#039;&#039;:&lt;br /&gt;
*Инициализация глобальной кучи - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Инициализация локальной кучи - требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Вычисление связей между парой точек - в худшем случае алгоритмом Штрассена вычисляется за &amp;lt;math&amp;gt;O(n*n^{2.37})&amp;lt;/math&amp;gt;, в среднем за &amp;lt;math&amp;gt;O(n m_\alpha m_m)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Построение каждой кучи - &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Сортировка каждой кучи -  &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Основной цикл объединения кластеров выполняется в &amp;lt;math&amp;gt;n-k&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
**Вставить новый кластер в в &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt; локальных куч размера &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt; &lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(n^2 + n m_m m_a + n^2 \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Сложность по памяти&#039;&#039;&#039;:&lt;br /&gt;
*Поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей, то общие затраты памяти не превышают &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Хранение связей - &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt; &#039;&#039;(поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей)&#039;&#039;&lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(\min \{ n^2, n m_m m_a \} )&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:Divanov dia2.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма == &lt;br /&gt;
:При &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - количество процессов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{n^2}{p}+nm_m m_\alpha + \frac{n^2\log n}{p})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Входные данные алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;&lt;br /&gt;
*Целевое количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Гиперпараметры алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Пороговое значение схожести &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt;&lt;br /&gt;
*Функция ожидания количества соседей &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Результат:&#039;&#039;&#039;&lt;br /&gt;
*Метка кластера для каждого объекта&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
*Детерменированность алгоритма&lt;br /&gt;
*Отношение последовательной и параллельной сложностей: &amp;lt;math&amp;gt;\frac{O(n^2+nm_m m_\alpha + n^2\log n)}{O(\frac{n^2}{p}+nm_m m_\alpha + \frac{n^2\log n}{p})}&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Вычислительная сложность: &amp;lt;math&amp;gt;\frac{O(n^2+nm_m m_\alpha + n^2\log n)}{2n+2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Divanov</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=20002</id>
		<title>Участник:Иванов Даниил/Алгоритм устойчивой кластеризации с иcпользованием связей</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=20002"/>
		<updated>2016-12-04T08:37:07Z</updated>

		<summary type="html">&lt;p&gt;Divanov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм устойчивой кластеризации с использованием связей&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(n^2 + n m_m m_a + n^2 \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = Множество &amp;lt;math&amp;gt;S&amp;lt;/math&amp;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;
| output_data       = &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;
== Общее описание алгоритма ==&lt;br /&gt;
:Алгоритм устойчивой кластеризации с иcпользованием связей (&#039;&#039;&#039;robust clustering using links&#039;&#039;&#039;, &#039;&#039;ROCK&#039;&#039;) решает задачу [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F кластеризации] объектов по заранее заданному количеству &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. В пространстве объектов должна быть определена функция сходства/расстояния между объекта &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;. Данный алгоритм относится к иерархическим методам кластеризации, который начинает с разбиения пространства на большое количество кластеров и постепенно объединяя их до нужного количества. Алгоритм пытается объединить в один кластер точки с максимальным числом общих соседей.&lt;br /&gt;
&lt;br /&gt;
:Данный алгоритм хорошо подходит для объектов с категориальными признаками (то есть признаками, принимающими небольшое количество значений). С помощью этого алгоритма также часто решается задача [https://en.wikipedia.org/wiki/Association_rule_learning поиска ассоциативных правил].&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
:Пусть дано множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;, натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;, пороговое значение &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt; и функция функция &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
:Результатом работы алгоритма является &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; непересекающихся кластеров, делящих множество &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Две точки называются &#039;&#039;соседними&#039;&#039;, если &amp;lt;math&amp;gt;sim(p_i, p_j) \geq \theta&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Количеством общих соседей &amp;lt;math&amp;gt;link(p_i, p_j)&amp;lt;/math&amp;gt; называется число точек, являющимися соседними для точек &amp;lt;math&amp;gt;p_i, p_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией связи между кластерами называется &amp;lt;math&amp;gt;link[C_i, C_j] = \sum_{\begin{smallmatrix}p_q\in C_i,\; p_r\in C_j\end{smallmatrix}}^{ } link(p_{q},p_r)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией качества является функция&lt;br /&gt;
:&amp;lt;math&amp;gt; g(C_i, C_j) = \frac{link[C_i,C_j]}{(n_i + n_j)^{1 + 2f(\theta )} - n_i^{1+2f(\theta )} - n_j^{1+2f(\theta )}}&amp;lt;/math&amp;gt;,  где &amp;lt;math&amp;gt;n_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;n&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
:Затем на каждом шаге он вычисляет значение &amp;lt;math&amp;gt;g(C_i, C_j)&amp;lt;/math&amp;gt; для каждой пары кластеров и объединяет эти кластеры в один.&lt;br /&gt;
:Алгоритм ведёт свою работу до тех пор, пока не получит &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:В качестве функции &amp;lt;math&amp;gt;f( \theta )&amp;lt;/math&amp;gt; обычно используется функция &amp;lt;math&amp;gt;f(\theta ) = \frac{\theta - 1}{\theta + 1}&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;n_i^{1+2f(\theta )}&amp;lt;/math&amp;gt; - ожидаемое число связей между парами объектов кластера &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Если все признаки категориальны, то в качестве функции схожести можно использовать функцию:&lt;br /&gt;
:&amp;lt;math&amp;gt;sim(p_i,p_j) = \frac{|p_i\cap p_j|}{|p_i\cup p_j|}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|p_i|&amp;lt;/math&amp;gt; - количество атрибутов в &amp;lt;math&amp;gt;p_i&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-k&amp;lt;/math&amp;gt; шагов кластеры последовательно объединяются. Реализовывается с помощью структуры данных &#039;&#039;куча&#039;&#039;. Для каждого кластера math&amp;gt;i&amp;lt;/math&amp;gt; хранится своя куча &amp;lt;math&amp;gt;q[i]&amp;lt;/math&amp;gt;, содержащая все связанный с ним кластеры, упорядоченная по убыванию функции качества. Также хранится глобальная куча &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, содержащая все кластеры &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, упорядоченные по мере убывания функции качества &amp;lt;math&amp;gt;g(j, max(q[j]))&amp;lt;/math&amp;gt;. На каждом шаге итерации, после объединения кластеров требуется перестроить кучи объединённых кластеров в одну и перестроить глобальную кучу.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
:Макроструктура состоит из последовательного выполнения двух шагов, описанных в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]]:&lt;br /&gt;
# Построении матрицы связей&lt;br /&gt;
# Пересчёте куч и объединении кластеров&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация основной вычислительной части:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line&amp;gt;&lt;br /&gt;
procedure cluster(S, k)&lt;br /&gt;
begin&lt;br /&gt;
    link := compute_links(S)&lt;br /&gt;
    for s in S do&lt;br /&gt;
    begin&lt;br /&gt;
        q[s] := build_local_heap(link, s)&lt;br /&gt;
    end&lt;br /&gt;
    Q := build_global_heap(S, q)&lt;br /&gt;
    while size(Q) &amp;gt; k do&lt;br /&gt;
    begin&lt;br /&gt;
        u := extract_max(Q)&lt;br /&gt;
        v := max(q[u])&lt;br /&gt;
        delete(Q, v)&lt;br /&gt;
        w := merge(u, v)&lt;br /&gt;
        for each x in q[u] or q[v] do&lt;br /&gt;
        begin&lt;br /&gt;
            link[x, w] := link[x, u] + link[x, v]&lt;br /&gt;
            delete(q[x], u)&lt;br /&gt;
            delete(q[x], v)&lt;br /&gt;
            insert(q[x], w, g(x, w))&lt;br /&gt;
            insert(q[w], x, g(x, w))&lt;br /&gt;
            update(Q, x, q[x])&lt;br /&gt;
        end&lt;br /&gt;
        insert(Q, w, q[w])&lt;br /&gt;
        deallocate(q[u])&lt;br /&gt;
        deallocate(q[v])&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Временная сложность&#039;&#039;&#039;:&lt;br /&gt;
*Инициализация глобальной кучи - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Инициализация локальной кучи - требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Вычисление связей между парой точек - в худшем случае алгоритмом Штрассена вычисляется за &amp;lt;math&amp;gt;O(n*n^{2.37})&amp;lt;/math&amp;gt;, в среднем за &amp;lt;math&amp;gt;O(n m_\alpha m_m)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Построение каждой кучи - &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Сортировка каждой кучи -  &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Основной цикл объединения кластеров выполняется в &amp;lt;math&amp;gt;n-k&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
**Вставить новый кластер в в &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt; локальных куч размера &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt; &lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(n^2 + n m_m m_a + n^2 \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Сложность по памяти&#039;&#039;&#039;:&lt;br /&gt;
*Поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей, то общие затраты памяти не превышают &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Хранение связей - &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt; &#039;&#039;(поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей)&#039;&#039;&lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(\min \{ n^2, n m_m m_a \} )&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:Divanov dia2.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма == &lt;br /&gt;
:При &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - количество процессов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{n^2}{p}+nm_m m_\alpha + \frac{n^2\log n}{p})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Входные данные алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;&lt;br /&gt;
*Целевое количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Гиперпараметры алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Пороговое значение схожести &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt;&lt;br /&gt;
*Функция ожидания количества соседей &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Результат:&#039;&#039;&#039;&lt;br /&gt;
*Метка кластера для каждого объекта&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
*Детерменированность алгоритма&lt;br /&gt;
*Отношение последовательной и параллельной сложностей: &amp;lt;math&amp;gt;\frac{O(n^2+nm_m m_\alpha + n^2\log n)}{O(\frac{n^2}{p}+nm_m m_\alpha + \frac{n^2\log n}{p})}&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Вычислительная сложность: &amp;lt;math&amp;gt;\frac{O(n^2+nm_m m_\alpha + n^2\log n)}{2n+2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Divanov</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=12188</id>
		<title>Участник:Иванов Даниил/Алгоритм устойчивой кластеризации с иcпользованием связей</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=12188"/>
		<updated>2016-10-15T21:41:12Z</updated>

		<summary type="html">&lt;p&gt;Divanov: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
:Алгоритм устойчивой кластеризации с иcпользованием связей (&#039;&#039;&#039;robust clustering using links&#039;&#039;&#039;, &#039;&#039;ROCK&#039;&#039;) решает задачу [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F кластеризации] объектов по заранее заданному количеству &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. В пространстве объектов должна быть определена функция сходства/расстояния между объекта &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;. Данный алгоритм относится к иерархическим методам кластеризации, который начинает с разбиения пространства на большое количество кластеров и постепенно объединяя их до нужного количества. Алгоритм пытается объединить в один кластер точки с максимальным числом общих соседей.&lt;br /&gt;
&lt;br /&gt;
:Данный алгоритм хорошо подходит для объектов с категориальными признаками (то есть признаками, принимающими небольшое количество значений). С помощью этого алгоритма также часто решается задача [https://en.wikipedia.org/wiki/Association_rule_learning поиска ассоциативных правил].&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
:Пусть дано множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;, натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;, пороговое значение &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt; и функция функция &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
:Результатом работы алгоритма является &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; непересекающихся кластеров, делящих множество &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Две точки называются &#039;&#039;соседними&#039;&#039;, если &amp;lt;math&amp;gt;sim(p_i, p_j) \geq \theta&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Количеством общих соседей &amp;lt;math&amp;gt;link(p_i, p_j)&amp;lt;/math&amp;gt; называется число точек, являющимися соседними для точек &amp;lt;math&amp;gt;p_i, p_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией связи между кластерами называется &amp;lt;math&amp;gt;link[C_i, C_j] = \sum_{\begin{smallmatrix}p_q\in C_i,\; p_r\in C_j\end{smallmatrix}}^{ } link(p_{q},p_r)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией качества является функция&lt;br /&gt;
:&amp;lt;math&amp;gt; g(C_i, C_j) = \frac{link[C_i,C_j]}{(n_i + n_j)^{1 + 2f(\theta )} - n_i^{1+2f(\theta )} - n_j^{1+2f(\theta )}}&amp;lt;/math&amp;gt;,  где &amp;lt;math&amp;gt;n_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;n&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
:Затем на каждом шаге он вычисляет значение &amp;lt;math&amp;gt;g(C_i, C_j)&amp;lt;/math&amp;gt; для каждой пары кластеров и объединяет эти кластеры в один.&lt;br /&gt;
:Алгоритм ведёт свою работу до тех пор, пока не получит &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:В качестве функции &amp;lt;math&amp;gt;f( \theta )&amp;lt;/math&amp;gt; обычно используется функция &amp;lt;math&amp;gt;f(\theta ) = \frac{\theta - 1}{\theta + 1}&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;n_i^{1+2f(\theta )}&amp;lt;/math&amp;gt; - ожидаемое число связей между парами объектов кластера &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Если все признаки категориальны, то в качестве функции схожести можно использовать функцию:&lt;br /&gt;
:&amp;lt;math&amp;gt;sim(p_i,p_j) = \frac{|p_i\cap p_j|}{|p_i\cup p_j|}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|p_i|&amp;lt;/math&amp;gt; - количество атрибутов в &amp;lt;math&amp;gt;p_i&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-k&amp;lt;/math&amp;gt; шагов кластеры последовательно объединяются. Реализовывается с помощью структуры данных &#039;&#039;куча&#039;&#039;. Для каждого кластера math&amp;gt;i&amp;lt;/math&amp;gt; хранится своя куча &amp;lt;math&amp;gt;q[i]&amp;lt;/math&amp;gt;, содержащая все связанный с ним кластеры, упорядоченная по убыванию функции качества. Также хранится глобальная куча &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, содержащая все кластеры &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, упорядоченные по мере убывания функции качества &amp;lt;math&amp;gt;g(j, max(q[j]))&amp;lt;/math&amp;gt;. На каждом шаге итерации, после объединения кластеров требуется перестроить кучи объединённых кластеров в одну и перестроить глобальную кучу.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
:Макроструктура состоит из последовательного выполнения двух шагов, описанных в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]]:&lt;br /&gt;
# Построении матрицы связей&lt;br /&gt;
# Пересчёте куч и объединении кластеров&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация основной вычислительной части:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line&amp;gt;&lt;br /&gt;
procedure cluster(S, k)&lt;br /&gt;
begin&lt;br /&gt;
    link := compute_links(S)&lt;br /&gt;
    for s in S do&lt;br /&gt;
    begin&lt;br /&gt;
        q[s] := build_local_heap(link, s)&lt;br /&gt;
    end&lt;br /&gt;
    Q := build_global_heap(S, q)&lt;br /&gt;
    while size(Q) &amp;gt; k do&lt;br /&gt;
    begin&lt;br /&gt;
        u := extract_max(Q)&lt;br /&gt;
        v := max(q[u])&lt;br /&gt;
        delete(Q, v)&lt;br /&gt;
        w := merge(u, v)&lt;br /&gt;
        for each x in q[u] or q[v] do&lt;br /&gt;
        begin&lt;br /&gt;
            link[x, w] := link[x, u] + link[x, v]&lt;br /&gt;
            delete(q[x], u)&lt;br /&gt;
            delete(q[x], v)&lt;br /&gt;
            insert(q[x], w, g(x, w))&lt;br /&gt;
            insert(q[w], x, g(x, w))&lt;br /&gt;
            update(Q, x, q[x])&lt;br /&gt;
        end&lt;br /&gt;
        insert(Q, w, q[w])&lt;br /&gt;
        deallocate(q[u])&lt;br /&gt;
        deallocate(q[v])&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Временная сложность&#039;&#039;&#039;:&lt;br /&gt;
*Инициализация глобальной кучи - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Инициализация локальной кучи - требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Вычисление связей между парой точек - в худшем случае алгоритмом Штрассена вычисляется за &amp;lt;math&amp;gt;O(n*n^{2.37})&amp;lt;/math&amp;gt;, в среднем за &amp;lt;math&amp;gt;O(n m_\alpha m_m)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Построение каждой кучи - &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Сортировка каждой кучи -  &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Основной цикл объединения кластеров выполняется в &amp;lt;math&amp;gt;n-k&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
**Вставить новый кластер в в &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt; локальных куч размера &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt; &lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(n^2 + n m_m m_a + n^2 \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Сложность по памяти&#039;&#039;&#039;:&lt;br /&gt;
*Поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей, то общие затраты памяти не превышают &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Хранение связей - &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt; &#039;&#039;(поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей)&#039;&#039;&lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(\min \{ n^2, n m_m m_a \} )&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:Divanov dia2.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма == &lt;br /&gt;
:При &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - количество процессов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{n^2}{p}+nm_m m_\alpha + \frac{n^2\log n}{p})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Входные данные алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;&lt;br /&gt;
*Целевое количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Гиперпараметры алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Пороговое значение схожести &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt;&lt;br /&gt;
*Функция ожидания количества соседей &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Результат:&#039;&#039;&#039;&lt;br /&gt;
*Метка кластера для каждого объекта&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
*Детерменированность алгоритма&lt;br /&gt;
*Отношение последовательной и параллельной сложностей: &amp;lt;math&amp;gt;\frac{O(n^2+nm_m m_\alpha + n^2\log n)}{O(\frac{n^2}{p}+nm_m m_\alpha + \frac{n^2\log n}{p})}&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Вычислительная сложность: &amp;lt;math&amp;gt;\frac{O(n^2+nm_m m_\alpha + n^2\log n)}{2n+2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Divanov</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=12182</id>
		<title>Участник:Иванов Даниил/Алгоритм устойчивой кластеризации с иcпользованием связей</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=12182"/>
		<updated>2016-10-15T21:37:24Z</updated>

		<summary type="html">&lt;p&gt;Divanov: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
:Алгоритм устойчивой кластеризации с иcпользованием связей (&#039;&#039;&#039;robust clustering using links&#039;&#039;&#039;, &#039;&#039;ROCK&#039;&#039;) решает задачу [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F кластеризации] объектов по заранее заданному количеству &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. В пространстве объектов должна быть определена функция сходства/расстояния между объекта &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;. Данный алгоритм относится к иерархическим методам кластеризации, который начинает с разбиения пространства на большое количество кластеров и постепенно объединяя их до нужного количества. Алгоритм пытается объединить в один кластер точки с максимальным числом общих соседей.&lt;br /&gt;
&lt;br /&gt;
:Данный алгоритм хорошо подходит для объектов с категориальными признаками (то есть признаками, принимающими небольшое количество значений). С помощью этого алгоритма также часто решается задача [https://en.wikipedia.org/wiki/Association_rule_learning поиска ассоциативных правил].&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
:Пусть дано множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;, натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;, пороговое значение &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt; и функция функция &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
:Результатом работы алгоритма является &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; непересекающихся кластеров, делящих множество &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Две точки называются &#039;&#039;соседними&#039;&#039;, если &amp;lt;math&amp;gt;sim(p_i, p_j) \geq \theta&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Количеством общих соседей &amp;lt;math&amp;gt;link(p_i, p_j)&amp;lt;/math&amp;gt; называется число точек, являющимися соседними для точек &amp;lt;math&amp;gt;p_i, p_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией связи между кластерами называется &amp;lt;math&amp;gt;link[C_i, C_j] = \sum_{\begin{smallmatrix}p_q\in C_i,\; p_r\in C_j\end{smallmatrix}}^{ } link(p_{q},p_r)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией качества является функция&lt;br /&gt;
:&amp;lt;math&amp;gt; g(C_i, C_j) = \frac{link[C_i,C_j]}{(n_i + n_j)^{1 + 2f(\theta )} - n_i^{1+2f(\theta )} - n_j^{1+2f(\theta )}}&amp;lt;/math&amp;gt;,  где &amp;lt;math&amp;gt;n_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;n&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
:Затем на каждом шаге он вычисляет значение &amp;lt;math&amp;gt;g(C_i, C_j)&amp;lt;/math&amp;gt; для каждой пары кластеров и объединяет эти кластеры в один.&lt;br /&gt;
:Алгоритм ведёт свою работу до тех пор, пока не получит &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:В качестве функции &amp;lt;math&amp;gt;f( \theta )&amp;lt;/math&amp;gt; обычно используется функция &amp;lt;math&amp;gt;f(\theta ) = \frac{\theta - 1}{\theta + 1}&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;n_i^{1+2f(\theta )}&amp;lt;/math&amp;gt; - ожидаемое число связей между парами объектов кластера &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Если все признаки категориальны, то в качестве функции схожести можно использовать функцию:&lt;br /&gt;
:&amp;lt;math&amp;gt;sim(p_i,p_j) = \frac{|p_i\cap p_j|}{|p_i\cup p_j|}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|p_i|&amp;lt;/math&amp;gt; - количество атрибутов в &amp;lt;math&amp;gt;p_i&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-k&amp;lt;/math&amp;gt; шагов кластеры последовательно объединяются. Реализовывается с помощью структуры данных &#039;&#039;куча&#039;&#039;. Для каждого кластера math&amp;gt;i&amp;lt;/math&amp;gt; хранится своя куча &amp;lt;math&amp;gt;q[i]&amp;lt;/math&amp;gt;, содержащая все связанный с ним кластеры, упорядоченная по убыванию функции качества. Также хранится глобальная куча &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, содержащая все кластеры &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, упорядоченные по мере убывания функции качества &amp;lt;math&amp;gt;g(j, max(q[j]))&amp;lt;/math&amp;gt;. На каждом шаге итерации, после объединения кластеров требуется перестроить кучи объединённых кластеров в одну и перестроить глобальную кучу.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
:Макроструктура состоит из последовательного выполнения двух шагов, описанных в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]]:&lt;br /&gt;
# Построении матрицы связей&lt;br /&gt;
# Пересчёте куч и объединении кластеров&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация основной вычислительной части:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line&amp;gt;&lt;br /&gt;
procedure cluster(S, k)&lt;br /&gt;
begin&lt;br /&gt;
    link := compute_links(S)&lt;br /&gt;
    for s in S do&lt;br /&gt;
    begin&lt;br /&gt;
        q[s] := build_local_heap(link, s)&lt;br /&gt;
    end&lt;br /&gt;
    Q := build_global_heap(S, q)&lt;br /&gt;
    while size(Q) &amp;gt; k do&lt;br /&gt;
    begin&lt;br /&gt;
        u := extract_max(Q)&lt;br /&gt;
        v := max(q[u])&lt;br /&gt;
        delete(Q, v)&lt;br /&gt;
        w := merge(u, v)&lt;br /&gt;
        for each x in q[u] or q[v] do&lt;br /&gt;
        begin&lt;br /&gt;
            link[x, w] := link[x, u] + link[x, v]&lt;br /&gt;
            delete(q[x], u)&lt;br /&gt;
            delete(q[x], v)&lt;br /&gt;
            insert(q[x], w, g(x, w))&lt;br /&gt;
            insert(q[w], x, g(x, w))&lt;br /&gt;
            update(Q, x, q[x])&lt;br /&gt;
        end&lt;br /&gt;
        insert(Q, w, q[w])&lt;br /&gt;
        deallocate(q[u])&lt;br /&gt;
        deallocate(q[v])&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Временная сложность&#039;&#039;&#039;:&lt;br /&gt;
*Инициализация глобальной кучи - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Инициализация локальной кучи - требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Вычисление связей между парой точек - в худшем случае алгоритмом Штрассена вычисляется за &amp;lt;math&amp;gt;O(n*n^{2.37})&amp;lt;/math&amp;gt;, в среднем за &amp;lt;math&amp;gt;O(n m_\alpha m_m)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Построение каждой кучи - &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Сортировка каждой кучи -  &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Основной цикл объединения кластеров выполняется в &amp;lt;math&amp;gt;n-k&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
**Вставить новый кластер в в &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt; локальных куч размера &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt; &lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(n^2 + n m_m m_a + n^2 \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Сложность по памяти&#039;&#039;&#039;:&lt;br /&gt;
*Поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей, то общие затраты памяти не превышают &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Хранение связей - &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt; &#039;&#039;(поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей)&#039;&#039;&lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(\min \{ n^2, n m_m m_a \} )&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:Divanov dia.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма == &lt;br /&gt;
:При &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - количество процессов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{n^2}{p}+nm_m m_\alpha + \frac{n^2\log n}{p})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Входные данные алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;&lt;br /&gt;
*Целевое количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Гиперпараметры алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Пороговое значение схожести &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt;&lt;br /&gt;
*Функция ожидания количества соседей &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Результат:&#039;&#039;&#039;&lt;br /&gt;
*Метка кластера для каждого объекта&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
*Детерменированность алгоритма&lt;br /&gt;
*Отношение последовательной и параллельной сложностей: &amp;lt;math&amp;gt;\frac{O(n^2+nm_m m_\alpha + n^2\log n)}{O(\frac{n^2}{p}+nm_m m_\alpha + \frac{n^2\log n}{p})}&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Вычислительная сложность: &amp;lt;math&amp;gt;\frac{O(n^2+nm_m m_\alpha + n^2\log n)}{2n+2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Divanov</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=12091</id>
		<title>Участник:Иванов Даниил/Алгоритм устойчивой кластеризации с иcпользованием связей</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=12091"/>
		<updated>2016-10-15T21:04:30Z</updated>

		<summary type="html">&lt;p&gt;Divanov: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
:Алгоритм устойчивой кластеризации с иcпользованием связей (&#039;&#039;&#039;robust clustering using links&#039;&#039;&#039;, &#039;&#039;ROCK&#039;&#039;) решает задачу [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F кластеризации] объектов по заранее заданному количеству &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. В пространстве объектов должна быть определена функция сходства/расстояния между объекта &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;. Данный алгоритм относится к иерархическим методам кластеризации, который начинает с разбиения пространства на большое количество кластеров и постепенно объединяя их до нужного количества. Алгоритм пытается объединить в один кластер точки с максимальным числом общих соседей.&lt;br /&gt;
&lt;br /&gt;
:Данный алгоритм хорошо подходит для объектов с категориальными признаками (то есть признаками, принимающими небольшое количество значений). С помощью этого алгоритма также часто решается задача [https://en.wikipedia.org/wiki/Association_rule_learning поиска ассоциативных правил].&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
:Пусть дано множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;, натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;, пороговое значение &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt; и функция функция &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
:Результатом работы алгоритма является &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; непересекающихся кластеров, делящих множество &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Две точки называются &#039;&#039;соседними&#039;&#039;, если &amp;lt;math&amp;gt;sim(p_i, p_j) \geq \theta&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Количеством общих соседей &amp;lt;math&amp;gt;link(p_i, p_j)&amp;lt;/math&amp;gt; называется число точек, являющимися соседними для точек &amp;lt;math&amp;gt;p_i, p_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией связи между кластерами называется &amp;lt;math&amp;gt;link[C_i, C_j] = \sum_{\begin{smallmatrix}p_q\in C_i,\; p_r\in C_j\end{smallmatrix}}^{ } link(p_{q},p_r)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией качества является функция&lt;br /&gt;
:&amp;lt;math&amp;gt; g(C_i, C_j) = \frac{link[C_i,C_j]}{(n_i + n_j)^{1 + 2f(\theta )} - n_i^{1+2f(\theta )} - n_j^{1+2f(\theta )}}&amp;lt;/math&amp;gt;,  где &amp;lt;math&amp;gt;n_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;n&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
:Затем на каждом шаге он вычисляет значение &amp;lt;math&amp;gt;g(C_i, C_j)&amp;lt;/math&amp;gt; для каждой пары кластеров и объединяет эти кластеры в один.&lt;br /&gt;
:Алгоритм ведёт свою работу до тех пор, пока не получит &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:В качестве функции &amp;lt;math&amp;gt;f( \theta )&amp;lt;/math&amp;gt; обычно используется функция &amp;lt;math&amp;gt;f(\theta ) = \frac{\theta - 1}{\theta + 1}&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;n_i^{1+2f(\theta )}&amp;lt;/math&amp;gt; - ожидаемое число связей между парами объектов кластера &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Если все признаки категориальны, то в качестве функции схожести можно использовать функцию:&lt;br /&gt;
:&amp;lt;math&amp;gt;sim(p_i,p_j) = \frac{|p_i\cap p_j|}{|p_i\cup p_j|}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|p_i|&amp;lt;/math&amp;gt; - количество атрибутов в &amp;lt;math&amp;gt;p_i&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-k&amp;lt;/math&amp;gt; шагов кластеры последовательно объединяются. Реализовывается с помощью структуры данных &#039;&#039;куча&#039;&#039;. Для каждого кластера math&amp;gt;i&amp;lt;/math&amp;gt; хранится своя куча &amp;lt;math&amp;gt;q[i]&amp;lt;/math&amp;gt;, содержащая все связанный с ним кластеры, упорядоченная по убыванию функции качества. Также хранится глобальная куча &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, содержащая все кластеры &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, упорядоченные по мере убывания функции качества &amp;lt;math&amp;gt;g(j, max(q[j]))&amp;lt;/math&amp;gt;. На каждом шаге итерации, после объединения кластеров требуется перестроить кучи объединённых кластеров в одну и перестроить глобальную кучу.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
:Макроструктура состоит из последовательного выполнения двух шагов, описанных в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]]:&lt;br /&gt;
# Построении матрицы связей&lt;br /&gt;
# Пересчёте куч и объединении кластеров&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация основной вычислительной части:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line&amp;gt;&lt;br /&gt;
procedure cluster(S, k)&lt;br /&gt;
begin&lt;br /&gt;
    link := compute_links(S)&lt;br /&gt;
    for s in S do&lt;br /&gt;
    begin&lt;br /&gt;
        q[s] := build_local_heap(link, s)&lt;br /&gt;
    end&lt;br /&gt;
    Q := build_global_heap(S, q)&lt;br /&gt;
    while size(Q) &amp;gt; k do&lt;br /&gt;
    begin&lt;br /&gt;
        u := extract_max(Q)&lt;br /&gt;
        v := max(q[u])&lt;br /&gt;
        delete(Q, v)&lt;br /&gt;
        w := merge(u, v)&lt;br /&gt;
        for each x in q[u] or q[v] do&lt;br /&gt;
        begin&lt;br /&gt;
            link[x, w] := link[x, u] + link[x, v]&lt;br /&gt;
            delete(q[x], u)&lt;br /&gt;
            delete(q[x], v)&lt;br /&gt;
            insert(q[x], w, g(x, w))&lt;br /&gt;
            insert(q[w], x, g(x, w))&lt;br /&gt;
            update(Q, x, q[x])&lt;br /&gt;
        end&lt;br /&gt;
        insert(Q, w, q[w])&lt;br /&gt;
        deallocate(q[u])&lt;br /&gt;
        deallocate(q[v])&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Временная сложность&#039;&#039;&#039;:&lt;br /&gt;
*Инициализация глобальной кучи - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Инициализация локальной кучи - требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Вычисление связей между парой точек - в худшем случае алгоритмом Штрассена вычисляется за &amp;lt;math&amp;gt;O(n*n^{2.37})&amp;lt;/math&amp;gt;, в среднем за &amp;lt;math&amp;gt;O(n m_\alpha m_m)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Построение каждой кучи - &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Сортировка каждой кучи -  &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Основной цикл объединения кластеров выполняется в &amp;lt;math&amp;gt;n-k&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
**Вставить новый кластер в в &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt; локальных куч размера &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt; &lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(n^2 + n m_m m_a + n^2 \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Сложность по памяти&#039;&#039;&#039;:&lt;br /&gt;
*Поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей, то общие затраты памяти не превышают &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Хранение связей - &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt; &#039;&#039;(поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей)&#039;&#039;&lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(\min \{ n^2, n m_m m_a \} )&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма == &lt;br /&gt;
:При &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - количество процессов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{n^2}{p}+nm_m m_\alpha + \frac{n^2\log n}{p})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Входные данные алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;&lt;br /&gt;
*Целевое количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Гиперпараметры алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Пороговое значение схожести &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt;&lt;br /&gt;
*Функция ожидания количества соседей &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Результат:&#039;&#039;&#039;&lt;br /&gt;
*Метка кластера для каждого объекта&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
*Детерменированность алгоритма&lt;br /&gt;
*Отношение последовательной и параллельной сложностей: &amp;lt;math&amp;gt;\frac{O(n^2+nm_m m_\alpha + n^2\log n)}{O(\frac{n^2}{p}+nm_m m_\alpha + \frac{n^2\log n}{p})}&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Вычислительная сложность: &amp;lt;math&amp;gt;\frac{O(n^2+nm_m m_\alpha + n^2\log n)}{2n+2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Divanov</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=12089</id>
		<title>Участник:Иванов Даниил/Алгоритм устойчивой кластеризации с иcпользованием связей</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=12089"/>
		<updated>2016-10-15T21:04:18Z</updated>

		<summary type="html">&lt;p&gt;Divanov: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
:Алгоритм устойчивой кластеризации с иcпользованием связей (&#039;&#039;&#039;robust clustering using links&#039;&#039;&#039;, &#039;&#039;ROCK&#039;&#039;) решает задачу [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F кластеризации] объектов по заранее заданному количеству &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. В пространстве объектов должна быть определена функция сходства/расстояния между объекта &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;. Данный алгоритм относится к иерархическим методам кластеризации, который начинает с разбиения пространства на большое количество кластеров и постепенно объединяя их до нужного количества. Алгоритм пытается объединить в один кластер точки с максимальным числом общих соседей.&lt;br /&gt;
&lt;br /&gt;
:Данный алгоритм хорошо подходит для объектов с категориальными признаками (то есть признаками, принимающими небольшое количество значений). С помощью этого алгоритма также часто решается задача [https://en.wikipedia.org/wiki/Association_rule_learning поиска ассоциативных правил].&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
:Пусть дано множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;, натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;, пороговое значение &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt; и функция функция &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
:Результатом работы алгоритма является &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; непересекающихся кластеров, делящих множество &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Две точки называются &#039;&#039;соседними&#039;&#039;, если &amp;lt;math&amp;gt;sim(p_i, p_j) \geq \theta&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Количеством общих соседей &amp;lt;math&amp;gt;link(p_i, p_j)&amp;lt;/math&amp;gt; называется число точек, являющимися соседними для точек &amp;lt;math&amp;gt;p_i, p_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией связи между кластерами называется &amp;lt;math&amp;gt;link[C_i, C_j] = \sum_{\begin{smallmatrix}p_q\in C_i,\; p_r\in C_j\end{smallmatrix}}^{ } link(p_{q},p_r)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией качества является функция&lt;br /&gt;
:&amp;lt;math&amp;gt; g(C_i, C_j) = \frac{link[C_i,C_j]}{(n_i + n_j)^{1 + 2f(\theta )} - n_i^{1+2f(\theta )} - n_j^{1+2f(\theta )}}&amp;lt;/math&amp;gt;,  где &amp;lt;math&amp;gt;n_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;n&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
:Затем на каждом шаге он вычисляет значение &amp;lt;math&amp;gt;g(C_i, C_j)&amp;lt;/math&amp;gt; для каждой пары кластеров и объединяет эти кластеры в один.&lt;br /&gt;
:Алгоритм ведёт свою работу до тех пор, пока не получит &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:В качестве функции &amp;lt;math&amp;gt;f( \theta )&amp;lt;/math&amp;gt; обычно используется функция &amp;lt;math&amp;gt;f(\theta ) = \frac{\theta - 1}{\theta + 1}&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;n_i^{1+2f(\theta )}&amp;lt;/math&amp;gt; - ожидаемое число связей между парами объектов кластера &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Если все признаки категориальны, то в качестве функции схожести можно использовать функцию:&lt;br /&gt;
:&amp;lt;math&amp;gt;sim(p_i,p_j) = \frac{|p_i\cap p_j|}{|p_i\cup p_j|}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|p_i|&amp;lt;/math&amp;gt; - количество атрибутов в &amp;lt;math&amp;gt;p_i&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-k&amp;lt;/math&amp;gt; шагов кластеры последовательно объединяются. Реализовывается с помощью структуры данных &#039;&#039;куча&#039;&#039;. Для каждого кластера math&amp;gt;i&amp;lt;/math&amp;gt; хранится своя куча &amp;lt;math&amp;gt;q[i]&amp;lt;/math&amp;gt;, содержащая все связанный с ним кластеры, упорядоченная по убыванию функции качества. Также хранится глобальная куча &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, содержащая все кластеры &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, упорядоченные по мере убывания функции качества &amp;lt;math&amp;gt;g(j, max(q[j]))&amp;lt;/math&amp;gt;. На каждом шаге итерации, после объединения кластеров требуется перестроить кучи объединённых кластеров в одну и перестроить глобальную кучу.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
:Макроструктура состоит из последовательного выполнения двух шагов, описанных в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]]:&lt;br /&gt;
# Построении матрицы связей&lt;br /&gt;
# Пересчёте куч и объединении кластеров&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация основной вычислительной части:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line&amp;gt;&lt;br /&gt;
procedure cluster(S, k)&lt;br /&gt;
begin&lt;br /&gt;
    link := compute_links(S)&lt;br /&gt;
    for s in S do&lt;br /&gt;
    begin&lt;br /&gt;
        q[s] := build_local_heap(link, s)&lt;br /&gt;
    end&lt;br /&gt;
    Q := build_global_heap(S, q)&lt;br /&gt;
    while size(Q) &amp;gt; k do&lt;br /&gt;
    begin&lt;br /&gt;
        u := extract_max(Q)&lt;br /&gt;
        v := max(q[u])&lt;br /&gt;
        delete(Q, v)&lt;br /&gt;
        w := merge(u, v)&lt;br /&gt;
        for each x in q[u] or q[v] do&lt;br /&gt;
        begin&lt;br /&gt;
            link[x, w] := link[x, u] + link[x, v]&lt;br /&gt;
            delete(q[x], u)&lt;br /&gt;
            delete(q[x], v)&lt;br /&gt;
            insert(q[x], w, g(x, w))&lt;br /&gt;
            insert(q[w], x, g(x, w))&lt;br /&gt;
            update(Q, x, q[x])&lt;br /&gt;
        end&lt;br /&gt;
        insert(Q, w, q[w])&lt;br /&gt;
        deallocate(q[u])&lt;br /&gt;
        deallocate(q[v])&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Временная сложность&#039;&#039;&#039;:&lt;br /&gt;
*Инициализация глобальной кучи - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Инициализация локальной кучи - требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Вычисление связей между парой точек - в худшем случае алгоритмом Штрассена вычисляется за &amp;lt;math&amp;gt;O(n*n^{2.37})&amp;lt;/math&amp;gt;, в среднем за &amp;lt;math&amp;gt;O(n m_\alpha m_m)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Построение каждой кучи - &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Сортировка каждой кучи -  &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Основной цикл объединения кластеров выполняется в &amp;lt;math&amp;gt;n-k&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
**Вставить новый кластер в в &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt; локальных куч размера &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt; &lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(n^2 + n m_m m_a + n^2 \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Сложность по памяти&#039;&#039;&#039;:&lt;br /&gt;
*Поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей, то общие затраты памяти не превышают &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Хранение связей - &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt; &#039;&#039;(поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей)&#039;&#039;&lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(\min \{ n^2, n m_m m_a \} )&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма == &lt;br /&gt;
:При &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - количество процессов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{n^2}{p}+nm_m m_\alpha + \frac{n^2\log n}{p})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Входные данные алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;&lt;br /&gt;
*Целевое количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Гиперпараметры алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Пороговое значение схожести &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt;&lt;br /&gt;
*Функция ожидания количества соседей &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Результат:&#039;&#039;&#039;&lt;br /&gt;
*Метка кластера для каждого объекта&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
:Детерменированность алгоритма&lt;br /&gt;
:Отношение последовательной и параллельной сложностей: &amp;lt;math&amp;gt;\frac{O(n^2+nm_m m_\alpha + n^2\log n)}{O(\frac{n^2}{p}+nm_m m_\alpha + \frac{n^2\log n}{p})}&amp;lt;/math&amp;gt;.&lt;br /&gt;
:Вычислительная сложность: &amp;lt;math&amp;gt;\frac{O(n^2+nm_m m_\alpha + n^2\log n)}{2n+2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Divanov</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=12070</id>
		<title>Участник:Иванов Даниил/Алгоритм устойчивой кластеризации с иcпользованием связей</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=12070"/>
		<updated>2016-10-15T21:00:48Z</updated>

		<summary type="html">&lt;p&gt;Divanov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
:Алгоритм устойчивой кластеризации с иcпользованием связей (&#039;&#039;&#039;robust clustering using links&#039;&#039;&#039;, &#039;&#039;ROCK&#039;&#039;) решает задачу [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F кластеризации] объектов по заранее заданному количеству &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. В пространстве объектов должна быть определена функция сходства/расстояния между объекта &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;. Данный алгоритм относится к иерархическим методам кластеризации, который начинает с разбиения пространства на большое количество кластеров и постепенно объединяя их до нужного количества. Алгоритм пытается объединить в один кластер точки с максимальным числом общих соседей.&lt;br /&gt;
&lt;br /&gt;
:Данный алгоритм хорошо подходит для объектов с категориальными признаками (то есть признаками, принимающими небольшое количество значений). С помощью этого алгоритма также часто решается задача [https://en.wikipedia.org/wiki/Association_rule_learning поиска ассоциативных правил].&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
:Пусть дано множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;, натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;, пороговое значение &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt; и функция функция &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
:Результатом работы алгоритма является &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; непересекающихся кластеров, делящих множество &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Две точки называются &#039;&#039;соседними&#039;&#039;, если &amp;lt;math&amp;gt;sim(p_i, p_j) \geq \theta&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Количеством общих соседей &amp;lt;math&amp;gt;link(p_i, p_j)&amp;lt;/math&amp;gt; называется число точек, являющимися соседними для точек &amp;lt;math&amp;gt;p_i, p_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией связи между кластерами называется &amp;lt;math&amp;gt;link[C_i, C_j] = \sum_{\begin{smallmatrix}p_q\in C_i,\; p_r\in C_j\end{smallmatrix}}^{ } link(p_{q},p_r)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией качества является функция&lt;br /&gt;
:&amp;lt;math&amp;gt; g(C_i, C_j) = \frac{link[C_i,C_j]}{(n_i + n_j)^{1 + 2f(\theta )} - n_i^{1+2f(\theta )} - n_j^{1+2f(\theta )}}&amp;lt;/math&amp;gt;,  где &amp;lt;math&amp;gt;n_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;n&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
:Затем на каждом шаге он вычисляет значение &amp;lt;math&amp;gt;g(C_i, C_j)&amp;lt;/math&amp;gt; для каждой пары кластеров и объединяет эти кластеры в один.&lt;br /&gt;
:Алгоритм ведёт свою работу до тех пор, пока не получит &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:В качестве функции &amp;lt;math&amp;gt;f( \theta )&amp;lt;/math&amp;gt; обычно используется функция &amp;lt;math&amp;gt;f(\theta ) = \frac{\theta - 1}{\theta + 1}&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;n_i^{1+2f(\theta )}&amp;lt;/math&amp;gt; - ожидаемое число связей между парами объектов кластера &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Если все признаки категориальны, то в качестве функции схожести можно использовать функцию:&lt;br /&gt;
:&amp;lt;math&amp;gt;sim(p_i,p_j) = \frac{|p_i\cap p_j|}{|p_i\cup p_j|}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|p_i|&amp;lt;/math&amp;gt; - количество атрибутов в &amp;lt;math&amp;gt;p_i&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-k&amp;lt;/math&amp;gt; шагов кластеры последовательно объединяются. Реализовывается с помощью структуры данных &#039;&#039;куча&#039;&#039;. Для каждого кластера math&amp;gt;i&amp;lt;/math&amp;gt; хранится своя куча &amp;lt;math&amp;gt;q[i]&amp;lt;/math&amp;gt;, содержащая все связанный с ним кластеры, упорядоченная по убыванию функции качества. Также хранится глобальная куча &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, содержащая все кластеры &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, упорядоченные по мере убывания функции качества &amp;lt;math&amp;gt;g(j, max(q[j]))&amp;lt;/math&amp;gt;. На каждом шаге итерации, после объединения кластеров требуется перестроить кучи объединённых кластеров в одну и перестроить глобальную кучу.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
:Макроструктура состоит из последовательного выполнения двух шагов, описанных в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]]:&lt;br /&gt;
# Построении матрицы связей&lt;br /&gt;
# Пересчёте куч и объединении кластеров&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация основной вычислительной части:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line&amp;gt;&lt;br /&gt;
procedure cluster(S, k)&lt;br /&gt;
begin&lt;br /&gt;
    link := compute_links(S)&lt;br /&gt;
    for s in S do&lt;br /&gt;
    begin&lt;br /&gt;
        q[s] := build_local_heap(link, s)&lt;br /&gt;
    end&lt;br /&gt;
    Q := build_global_heap(S, q)&lt;br /&gt;
    while size(Q) &amp;gt; k do&lt;br /&gt;
    begin&lt;br /&gt;
        u := extract_max(Q)&lt;br /&gt;
        v := max(q[u])&lt;br /&gt;
        delete(Q, v)&lt;br /&gt;
        w := merge(u, v)&lt;br /&gt;
        for each x in q[u] or q[v] do&lt;br /&gt;
        begin&lt;br /&gt;
            link[x, w] := link[x, u] + link[x, v]&lt;br /&gt;
            delete(q[x], u)&lt;br /&gt;
            delete(q[x], v)&lt;br /&gt;
            insert(q[x], w, g(x, w))&lt;br /&gt;
            insert(q[w], x, g(x, w))&lt;br /&gt;
            update(Q, x, q[x])&lt;br /&gt;
        end&lt;br /&gt;
        insert(Q, w, q[w])&lt;br /&gt;
        deallocate(q[u])&lt;br /&gt;
        deallocate(q[v])&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Временная сложность&#039;&#039;&#039;:&lt;br /&gt;
*Инициализация глобальной кучи - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Инициализация локальной кучи - требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Вычисление связей между парой точек - в худшем случае алгоритмом Штрассена вычисляется за &amp;lt;math&amp;gt;O(n*n^{2.37})&amp;lt;/math&amp;gt;, в среднем за &amp;lt;math&amp;gt;O(n m_\alpha m_m)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Построение каждой кучи - &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Сортировка каждой кучи -  &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Основной цикл объединения кластеров выполняется в &amp;lt;math&amp;gt;n-k&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
**Вставить новый кластер в в &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt; локальных куч размера &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt; &lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(n^2 + n m_m m_a + n^2 \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Сложность по памяти&#039;&#039;&#039;:&lt;br /&gt;
*Поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей, то общие затраты памяти не превышают &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Хранение связей - &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt; &#039;&#039;(поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей)&#039;&#039;&lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(\min \{ n^2, n m_m m_a \} )&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма == &lt;br /&gt;
:При &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - количество процессов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{n^2}{p}+nm_m m_\alpha + \frac{n^2\log n}{p})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Входные данные алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;&lt;br /&gt;
*Целевое количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Гиперпараметры алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Пороговое значение схожести &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt;&lt;br /&gt;
*Функция ожидания количества соседей &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Результат:&#039;&#039;&#039;&lt;br /&gt;
*Метка кластера для каждого объекта&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Divanov</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=12022</id>
		<title>Участник:Иванов Даниил/Алгоритм устойчивой кластеризации с иcпользованием связей</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=12022"/>
		<updated>2016-10-15T20:55:34Z</updated>

		<summary type="html">&lt;p&gt;Divanov: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Вступление&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
:Алгоритм устойчивой кластеризации с иcпользованием связей (&#039;&#039;&#039;robust clustering using links&#039;&#039;&#039;, &#039;&#039;ROCK&#039;&#039;) решает задачу [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F кластеризации] объектов по заранее заданному количеству &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. В пространстве объектов должна быть определена функция сходства/расстояния между объекта &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;. Данный алгоритм относится к иерархическим методам кластеризации, который начинает с разбиения пространства на большое количество кластеров и постепенно объединяя их до нужного количества. Алгоритм пытается объединить в один кластер точки с максимальным числом общих соседей.&lt;br /&gt;
&lt;br /&gt;
:Данный алгоритм хорошо подходит для объектов с категориальными признаками (то есть признаками, принимающими небольшое количество значений). С помощью этого алгоритма также часто решается задача [https://en.wikipedia.org/wiki/Association_rule_learning поиска ассоциативных правил].&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
:Пусть дано множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;, натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;, пороговое значение &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt; и функция функция &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
:Результатом работы алгоритма является &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; непересекающихся кластеров, делящих множество &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Две точки называются &#039;&#039;соседними&#039;&#039;, если &amp;lt;math&amp;gt;sim(p_i, p_j) \geq \theta&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Количеством общих соседей &amp;lt;math&amp;gt;link(p_i, p_j)&amp;lt;/math&amp;gt; называется число точек, являющимися соседними для точек &amp;lt;math&amp;gt;p_i, p_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией связи между кластерами называется &amp;lt;math&amp;gt;link[C_i, C_j] = \sum_{\begin{smallmatrix}p_q\in C_i,\; p_r\in C_j\end{smallmatrix}}^{ } link(p_{q},p_r)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией качества является функция&lt;br /&gt;
:&amp;lt;math&amp;gt; g(C_i, C_j) = \frac{link[C_i,C_j]}{(n_i + n_j)^{1 + 2f(\theta )} - n_i^{1+2f(\theta )} - n_j^{1+2f(\theta )}}&amp;lt;/math&amp;gt;,  где &amp;lt;math&amp;gt;n_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;n&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
:Затем на каждом шаге он вычисляет значение &amp;lt;math&amp;gt;g(C_i, C_j)&amp;lt;/math&amp;gt; для каждой пары кластеров и объединяет эти кластеры в один.&lt;br /&gt;
:Алгоритм ведёт свою работу до тех пор, пока не получит &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:В качестве функции &amp;lt;math&amp;gt;f( \theta )&amp;lt;/math&amp;gt; обычно используется функция &amp;lt;math&amp;gt;f(\theta ) = \frac{\theta - 1}{\theta + 1}&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;n_i^{1+2f(\theta )}&amp;lt;/math&amp;gt; - ожидаемое число связей между парами объектов кластера &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Если все признаки категориальны, то в качестве функции схожести можно использовать функцию:&lt;br /&gt;
:&amp;lt;math&amp;gt;sim(p_i,p_j) = \frac{|p_i\cap p_j|}{|p_i\cup p_j|}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|p_i|&amp;lt;/math&amp;gt; - количество атрибутов в &amp;lt;math&amp;gt;p_i&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-k&amp;lt;/math&amp;gt; шагов кластеры последовательно объединяются. Реализовывается с помощью структуры данных &#039;&#039;куча&#039;&#039;. Для каждого кластера math&amp;gt;i&amp;lt;/math&amp;gt; хранится своя куча &amp;lt;math&amp;gt;q[i]&amp;lt;/math&amp;gt;, содержащая все связанный с ним кластеры, упорядоченная по убыванию функции качества. Также хранится глобальная куча &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, содержащая все кластеры &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, упорядоченные по мере убывания функции качества &amp;lt;math&amp;gt;g(j, max(q[j]))&amp;lt;/math&amp;gt;. На каждом шаге итерации, после объединения кластеров требуется перестроить кучи объединённых кластеров в одну и перестроить глобальную кучу.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
:Макроструктура состоит из последовательного выполнения двух шагов, описанных в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]]:&lt;br /&gt;
# Построении матрицы связей&lt;br /&gt;
# Пересчёте куч и объединении кластеров&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация основной вычислительной части:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line&amp;gt;&lt;br /&gt;
procedure cluster(S, k)&lt;br /&gt;
begin&lt;br /&gt;
    link := compute_links(S)&lt;br /&gt;
    for s in S do&lt;br /&gt;
    begin&lt;br /&gt;
        q[s] := build_local_heap(link, s)&lt;br /&gt;
    end&lt;br /&gt;
    Q := build_global_heap(S, q)&lt;br /&gt;
    while size(Q) &amp;gt; k do&lt;br /&gt;
    begin&lt;br /&gt;
        u := extract_max(Q)&lt;br /&gt;
        v := max(q[u])&lt;br /&gt;
        delete(Q, v)&lt;br /&gt;
        w := merge(u, v)&lt;br /&gt;
        for each x in q[u] or q[v] do&lt;br /&gt;
        begin&lt;br /&gt;
            link[x, w] := link[x, u] + link[x, v]&lt;br /&gt;
            delete(q[x], u)&lt;br /&gt;
            delete(q[x], v)&lt;br /&gt;
            insert(q[x], w, g(x, w))&lt;br /&gt;
            insert(q[w], x, g(x, w))&lt;br /&gt;
            update(Q, x, q[x])&lt;br /&gt;
        end&lt;br /&gt;
        insert(Q, w, q[w])&lt;br /&gt;
        deallocate(q[u])&lt;br /&gt;
        deallocate(q[v])&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Временная сложность&#039;&#039;&#039;:&lt;br /&gt;
*Инициализация глобальной кучи - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Инициализация локальной кучи - требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Вычисление связей между парой точек - в худшем случае алгоритмом Штрассена вычисляется за &amp;lt;math&amp;gt;O(n*n^{2.37})&amp;lt;/math&amp;gt;, в среднем за &amp;lt;math&amp;gt;O(n m_\alpha m_m)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Построение каждой кучи - &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Сортировка каждой кучи -  &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Основной цикл объединения кластеров выполняется в &amp;lt;math&amp;gt;n-k&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
**Вставить новый кластер в в &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt; локальных куч размера &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt; &lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(n^2 + n m_m m_a + n^2 \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Сложность по памяти&#039;&#039;&#039;:&lt;br /&gt;
*Поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей, то общие затраты памяти не превышают &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Хранение связей - &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt; &#039;&#039;(поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей)&#039;&#039;&lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(\min \{ n^2, n m_m m_a \} )&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма == &lt;br /&gt;
:При &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - количество процессов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{n^2}{p}+nm_m m_\alpha + \frac{n^2\log n}{p})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Входные данные алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;&lt;br /&gt;
*Целевое количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Гиперпараметры алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Пороговое значение схожести &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt;&lt;br /&gt;
*Функция ожидания количества соседей &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Результат:&#039;&#039;&#039;&lt;br /&gt;
*Метка кластера для каждого объекта&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Divanov</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=12019</id>
		<title>Участник:Иванов Даниил/Алгоритм устойчивой кластеризации с иcпользованием связей</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=12019"/>
		<updated>2016-10-15T20:55:23Z</updated>

		<summary type="html">&lt;p&gt;Divanov: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Вступление&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
:Алгоритм устойчивой кластеризации с иcпользованием связей (&#039;&#039;&#039;robust clustering using links&#039;&#039;&#039;, &#039;&#039;ROCK&#039;&#039;) решает задачу [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F кластеризации] объектов по заранее заданному количеству &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. В пространстве объектов должна быть определена функция сходства/расстояния между объекта &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;. Данный алгоритм относится к иерархическим методам кластеризации, который начинает с разбиения пространства на большое количество кластеров и постепенно объединяя их до нужного количества. Алгоритм пытается объединить в один кластер точки с максимальным числом общих соседей.&lt;br /&gt;
&lt;br /&gt;
:Данный алгоритм хорошо подходит для объектов с категориальными признаками (то есть признаками, принимающими небольшое количество значений). С помощью этого алгоритма также часто решается задача [https://en.wikipedia.org/wiki/Association_rule_learning поиска ассоциативных правил].&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
:Пусть дано множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;, натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;, пороговое значение &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt; и функция функция &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
:Результатом работы алгоритма является &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; непересекающихся кластеров, делящих множество &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Две точки называются &#039;&#039;соседними&#039;&#039;, если &amp;lt;math&amp;gt;sim(p_i, p_j) \geq \theta&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Количеством общих соседей &amp;lt;math&amp;gt;link(p_i, p_j)&amp;lt;/math&amp;gt; называется число точек, являющимися соседними для точек &amp;lt;math&amp;gt;p_i, p_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией связи между кластерами называется &amp;lt;math&amp;gt;link[C_i, C_j] = \sum_{\begin{smallmatrix}p_q\in C_i,\; p_r\in C_j\end{smallmatrix}}^{ } link(p_{q},p_r)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией качества является функция&lt;br /&gt;
:&amp;lt;math&amp;gt; g(C_i, C_j) = \frac{link[C_i,C_j]}{(n_i + n_j)^{1 + 2f(\theta )} - n_i^{1+2f(\theta )} - n_j^{1+2f(\theta )}}&amp;lt;/math&amp;gt;,  где &amp;lt;math&amp;gt;n_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;n&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
:Затем на каждом шаге он вычисляет значение &amp;lt;math&amp;gt;g(C_i, C_j)&amp;lt;/math&amp;gt; для каждой пары кластеров и объединяет эти кластеры в один.&lt;br /&gt;
:Алгоритм ведёт свою работу до тех пор, пока не получит &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:В качестве функции &amp;lt;math&amp;gt;f( \theta )&amp;lt;/math&amp;gt; обычно используется функция &amp;lt;math&amp;gt;f(\theta ) = \frac{\theta - 1}{\theta + 1}&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;n_i^{1+2f(\theta )}&amp;lt;/math&amp;gt; - ожидаемое число связей между парами объектов кластера &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Если все признаки категориальны, то в качестве функции схожести можно использовать функцию:&lt;br /&gt;
:&amp;lt;math&amp;gt;sim(p_i,p_j) = \frac{|p_i\cap p_j|}{|p_i\cup p_j|}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|p_i|&amp;lt;/math&amp;gt; - количество атрибутов в &amp;lt;math&amp;gt;p_i&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-k&amp;lt;/math&amp;gt; шагов кластеры последовательно объединяются. Реализовывается с помощью структуры данных &#039;&#039;куча&#039;&#039;. Для каждого кластера math&amp;gt;i&amp;lt;/math&amp;gt; хранится своя куча &amp;lt;math&amp;gt;q[i]&amp;lt;/math&amp;gt;, содержащая все связанный с ним кластеры, упорядоченная по убыванию функции качества. Также хранится глобальная куча &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, содержащая все кластеры &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, упорядоченные по мере убывания функции качества &amp;lt;math&amp;gt;g(j, max(q[j]))&amp;lt;/math&amp;gt;. На каждом шаге итерации, после объединения кластеров требуется перестроить кучи объединённых кластеров в одну и перестроить глобальную кучу.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
:Макроструктура состоит из последовательного выполнения двух шагов, описанных в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]]:&lt;br /&gt;
# Построении матрицы связей&lt;br /&gt;
# Пересчёте куч и объединении кластеров&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация основной вычислительной части:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line&amp;gt;&lt;br /&gt;
procedure cluster(S, k)&lt;br /&gt;
begin&lt;br /&gt;
    link := compute_links(S)&lt;br /&gt;
    for s in S do&lt;br /&gt;
    begin&lt;br /&gt;
        q[s] := build_local_heap(link, s)&lt;br /&gt;
    end&lt;br /&gt;
    Q := build_global_heap(S, q)&lt;br /&gt;
    while size(Q) &amp;gt; k do&lt;br /&gt;
    begin&lt;br /&gt;
        u := extract_max(Q)&lt;br /&gt;
        v := max(q[u])&lt;br /&gt;
        delete(Q, v)&lt;br /&gt;
        w := merge(u, v)&lt;br /&gt;
        for each x in q[u] or q[v] do&lt;br /&gt;
        begin&lt;br /&gt;
            link[x, w] := link[x, u] + link[x, v]&lt;br /&gt;
            delete(q[x], u)&lt;br /&gt;
            delete(q[x], v)&lt;br /&gt;
            insert(q[x], w, g(x, w))&lt;br /&gt;
            insert(q[w], x, g(x, w))&lt;br /&gt;
            update(Q, x, q[x])&lt;br /&gt;
        end&lt;br /&gt;
        insert(Q, w, q[w])&lt;br /&gt;
        deallocate(q[u])&lt;br /&gt;
        deallocate(q[v])&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Временная сложность&#039;&#039;&#039;:&lt;br /&gt;
*Инициализация глобальной кучи - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Инициализация локальной кучи - требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Вычисление связей между парой точек - в худшем случае алгоритмом Штрассена вычисляется за &amp;lt;math&amp;gt;O(n*n^{2.37})&amp;lt;/math&amp;gt;, в среднем за &amp;lt;math&amp;gt;O(n m_\alpha m_m)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Построение каждой кучи - &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Сортировка каждой кучи -  &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Основной цикл объединения кластеров выполняется в &amp;lt;math&amp;gt;n-k&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
**Вставить новый кластер в в &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt; локальных куч размера &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt; &lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(n^2 + n m_m m_a + n^2 \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Сложность по памяти&#039;&#039;&#039;:&lt;br /&gt;
*Поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей, то общие затраты памяти не превышают &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Хранение связей - &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt; &#039;&#039;(поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей)&#039;&#039;&lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(\min \{ n^2, n m_m m_a \} )&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма == &lt;br /&gt;
При &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - количество процессов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{n^2}{p}+nm_m m_\alpha + \frac{n^2\log n}{p})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Входные данные алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;&lt;br /&gt;
*Целевое количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Гиперпараметры алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Пороговое значение схожести &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt;&lt;br /&gt;
*Функция ожидания количества соседей &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Результат:&#039;&#039;&#039;&lt;br /&gt;
*Метка кластера для каждого объекта&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Divanov</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=12012</id>
		<title>Участник:Иванов Даниил/Алгоритм устойчивой кластеризации с иcпользованием связей</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=12012"/>
		<updated>2016-10-15T20:54:35Z</updated>

		<summary type="html">&lt;p&gt;Divanov: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Вступление&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
:Алгоритм устойчивой кластеризации с иcпользованием связей (&#039;&#039;&#039;robust clustering using links&#039;&#039;&#039;, &#039;&#039;ROCK&#039;&#039;) решает задачу [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F кластеризации] объектов по заранее заданному количеству &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. В пространстве объектов должна быть определена функция сходства/расстояния между объекта &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;. Данный алгоритм относится к иерархическим методам кластеризации, который начинает с разбиения пространства на большое количество кластеров и постепенно объединяя их до нужного количества. Алгоритм пытается объединить в один кластер точки с максимальным числом общих соседей.&lt;br /&gt;
&lt;br /&gt;
:Данный алгоритм хорошо подходит для объектов с категориальными признаками (то есть признаками, принимающими небольшое количество значений). С помощью этого алгоритма также часто решается задача [https://en.wikipedia.org/wiki/Association_rule_learning поиска ассоциативных правил].&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
:Пусть дано множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;, натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;, пороговое значение &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt; и функция функция &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
:Результатом работы алгоритма является &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; непересекающихся кластеров, делящих множество &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Две точки называются &#039;&#039;соседними&#039;&#039;, если &amp;lt;math&amp;gt;sim(p_i, p_j) \geq \theta&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Количеством общих соседей &amp;lt;math&amp;gt;link(p_i, p_j)&amp;lt;/math&amp;gt; называется число точек, являющимися соседними для точек &amp;lt;math&amp;gt;p_i, p_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией связи между кластерами называется &amp;lt;math&amp;gt;link[C_i, C_j] = \sum_{\begin{smallmatrix}p_q\in C_i,\; p_r\in C_j\end{smallmatrix}}^{ } link(p_{q},p_r)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией качества является функция&lt;br /&gt;
:&amp;lt;math&amp;gt; g(C_i, C_j) = \frac{link[C_i,C_j]}{(n_i + n_j)^{1 + 2f(\theta )} - n_i^{1+2f(\theta )} - n_j^{1+2f(\theta )}}&amp;lt;/math&amp;gt;,  где &amp;lt;math&amp;gt;n_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;n&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
:Затем на каждом шаге он вычисляет значение &amp;lt;math&amp;gt;g(C_i, C_j)&amp;lt;/math&amp;gt; для каждой пары кластеров и объединяет эти кластеры в один.&lt;br /&gt;
:Алгоритм ведёт свою работу до тех пор, пока не получит &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:В качестве функции &amp;lt;math&amp;gt;f( \theta )&amp;lt;/math&amp;gt; обычно используется функция &amp;lt;math&amp;gt;f(\theta ) = \frac{\theta - 1}{\theta + 1}&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;n_i^{1+2f(\theta )}&amp;lt;/math&amp;gt; - ожидаемое число связей между парами объектов кластера &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Если все признаки категориальны, то в качестве функции схожести можно использовать функцию:&lt;br /&gt;
:&amp;lt;math&amp;gt;sim(p_i,p_j) = \frac{|p_i\cap p_j|}{|p_i\cup p_j|}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|p_i|&amp;lt;/math&amp;gt; - количество атрибутов в &amp;lt;math&amp;gt;p_i&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-k&amp;lt;/math&amp;gt; шагов кластеры последовательно объединяются. Реализовывается с помощью структуры данных &#039;&#039;куча&#039;&#039;. Для каждого кластера math&amp;gt;i&amp;lt;/math&amp;gt; хранится своя куча &amp;lt;math&amp;gt;q[i]&amp;lt;/math&amp;gt;, содержащая все связанный с ним кластеры, упорядоченная по убыванию функции качества. Также хранится глобальная куча &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, содержащая все кластеры &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, упорядоченные по мере убывания функции качества &amp;lt;math&amp;gt;g(j, max(q[j]))&amp;lt;/math&amp;gt;. На каждом шаге итерации, после объединения кластеров требуется перестроить кучи объединённых кластеров в одну и перестроить глобальную кучу.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
:Макроструктура состоит из последовательного выполнения двух шагов, описанных в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]]:&lt;br /&gt;
# Построении матрицы связей&lt;br /&gt;
# Пересчёте куч и объединении кластеров&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация основной вычислительной части:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line&amp;gt;&lt;br /&gt;
procedure cluster(S, k)&lt;br /&gt;
begin&lt;br /&gt;
    link := compute_links(S)&lt;br /&gt;
    for s in S do&lt;br /&gt;
    begin&lt;br /&gt;
        q[s] := build_local_heap(link, s)&lt;br /&gt;
    end&lt;br /&gt;
    Q := build_global_heap(S, q)&lt;br /&gt;
    while size(Q) &amp;gt; k do&lt;br /&gt;
    begin&lt;br /&gt;
        u := extract_max(Q)&lt;br /&gt;
        v := max(q[u])&lt;br /&gt;
        delete(Q, v)&lt;br /&gt;
        w := merge(u, v)&lt;br /&gt;
        for each x in q[u] or q[v] do&lt;br /&gt;
        begin&lt;br /&gt;
            link[x, w] := link[x, u] + link[x, v]&lt;br /&gt;
            delete(q[x], u)&lt;br /&gt;
            delete(q[x], v)&lt;br /&gt;
            insert(q[x], w, g(x, w))&lt;br /&gt;
            insert(q[w], x, g(x, w))&lt;br /&gt;
            update(Q, x, q[x])&lt;br /&gt;
        end&lt;br /&gt;
        insert(Q, w, q[w])&lt;br /&gt;
        deallocate(q[u])&lt;br /&gt;
        deallocate(q[v])&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Временная сложность&#039;&#039;&#039;:&lt;br /&gt;
*Инициализация глобальной кучи - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Инициализация локальной кучи - требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Вычисление связей между парой точек - в худшем случае алгоритмом Штрассена вычисляется за &amp;lt;math&amp;gt;O(n*n^{2.37})&amp;lt;/math&amp;gt;, в среднем за &amp;lt;math&amp;gt;O(n m_\alpha m_m)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Построение каждой кучи - &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Сортировка каждой кучи -  &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Основной цикл объединения кластеров выполняется в &amp;lt;math&amp;gt;n-k&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
**Вставить новый кластер в в &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt; локальных куч размера &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt; &lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(n^2 + n m_m m_a + n^2 \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Сложность по памяти&#039;&#039;&#039;:&lt;br /&gt;
*Поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей, то общие затраты памяти не превышают &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Хранение связей - &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt; &#039;&#039;(поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей)&#039;&#039;&lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(\min \{ n^2, n m_m m_a \} )&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма == &lt;br /&gt;
&amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - количество процессов.&lt;br /&gt;
&lt;br /&gt;
*Параллельное построение матрицы связей: &amp;lt;math&amp;gt;O(\frac{n^2}{p})&amp;lt;/math&amp;gt;&lt;br /&gt;
*Параллельное построение начальной кучи (функция &amp;lt;math&amp;gt;build\_local\_heap&amp;lt;/math&amp;gt;) -  &amp;lt;math&amp;gt;\frac{n}{p}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Входные данные алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;&lt;br /&gt;
*Целевое количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Гиперпараметры алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Пороговое значение схожести &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt;&lt;br /&gt;
*Функция ожидания количества соседей &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Результат:&#039;&#039;&#039;&lt;br /&gt;
*Метка кластера для каждого объекта&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Divanov</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=11991</id>
		<title>Участник:Иванов Даниил/Алгоритм устойчивой кластеризации с иcпользованием связей</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=11991"/>
		<updated>2016-10-15T20:51:55Z</updated>

		<summary type="html">&lt;p&gt;Divanov: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Вступление&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
:Алгоритм устойчивой кластеризации с иcпользованием связей (&#039;&#039;&#039;robust clustering using links&#039;&#039;&#039;, &#039;&#039;ROCK&#039;&#039;) решает задачу [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F кластеризации] объектов по заранее заданному количеству &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. В пространстве объектов должна быть определена функция сходства/расстояния между объекта &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;. Данный алгоритм относится к иерархическим методам кластеризации, который начинает с разбиения пространства на большое количество кластеров и постепенно объединяя их до нужного количества. Алгоритм пытается объединить в один кластер точки с максимальным числом общих соседей.&lt;br /&gt;
&lt;br /&gt;
:Данный алгоритм хорошо подходит для объектов с категориальными признаками (то есть признаками, принимающими небольшое количество значений). С помощью этого алгоритма также часто решается задача [https://en.wikipedia.org/wiki/Association_rule_learning поиска ассоциативных правил].&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
:Пусть дано множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;, натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;, пороговое значение &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt; и функция функция &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
:Результатом работы алгоритма является &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; непересекающихся кластеров, делящих множество &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Две точки называются &#039;&#039;соседними&#039;&#039;, если &amp;lt;math&amp;gt;sim(p_i, p_j) \geq \theta&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Количеством общих соседей &amp;lt;math&amp;gt;link(p_i, p_j)&amp;lt;/math&amp;gt; называется число точек, являющимися соседними для точек &amp;lt;math&amp;gt;p_i, p_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией связи между кластерами называется &amp;lt;math&amp;gt;link[C_i, C_j] = \sum_{\begin{smallmatrix}p_q\in C_i,\; p_r\in C_j\end{smallmatrix}}^{ } link(p_{q},p_r)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией качества является функция&lt;br /&gt;
:&amp;lt;math&amp;gt; g(C_i, C_j) = \frac{link[C_i,C_j]}{(n_i + n_j)^{1 + 2f(\theta )} - n_i^{1+2f(\theta )} - n_j^{1+2f(\theta )}}&amp;lt;/math&amp;gt;,  где &amp;lt;math&amp;gt;n_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;n&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
:Затем на каждом шаге он вычисляет значение &amp;lt;math&amp;gt;g(C_i, C_j)&amp;lt;/math&amp;gt; для каждой пары кластеров и объединяет эти кластеры в один.&lt;br /&gt;
:Алгоритм ведёт свою работу до тех пор, пока не получит &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:В качестве функции &amp;lt;math&amp;gt;f( \theta )&amp;lt;/math&amp;gt; обычно используется функция &amp;lt;math&amp;gt;f(\theta ) = \frac{\theta - 1}{\theta + 1}&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;n_i^{1+2f(\theta )}&amp;lt;/math&amp;gt; - ожидаемое число связей между парами объектов кластера &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Если все признаки категориальны, то в качестве функции схожести можно использовать функцию:&lt;br /&gt;
:&amp;lt;math&amp;gt;sim(p_i,p_j) = \frac{|p_i\cap p_j|}{|p_i\cup p_j|}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|p_i|&amp;lt;/math&amp;gt; - количество атрибутов в &amp;lt;math&amp;gt;p_i&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-k&amp;lt;/math&amp;gt; шагов кластеры последовательно объединяются. Реализовывается с помощью структуры данных &#039;&#039;куча&#039;&#039;. Для каждого кластера math&amp;gt;i&amp;lt;/math&amp;gt; хранится своя куча &amp;lt;math&amp;gt;q[i]&amp;lt;/math&amp;gt;, содержащая все связанный с ним кластеры, упорядоченная по убыванию функции качества. Также хранится глобальная куча &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, содержащая все кластеры &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, упорядоченные по мере убывания функции качества &amp;lt;math&amp;gt;g(j, max(q[j]))&amp;lt;/math&amp;gt;. На каждом шаге итерации, после объединения кластеров требуется перестроить кучи объединённых кластеров в одну и перестроить глобальную кучу.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
:Макроструктура состоит из последовательного выполнения двух шагов, описанных в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]]:&lt;br /&gt;
# Построении матрицы связей&lt;br /&gt;
# Пересчёте куч и объединении кластеров&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация основной вычислительной части:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line&amp;gt;&lt;br /&gt;
procedure cluster(S, k)&lt;br /&gt;
begin&lt;br /&gt;
    link := compute_links(S)&lt;br /&gt;
    for s in S do&lt;br /&gt;
    begin&lt;br /&gt;
        q[s] := build_local_heap(link, s)&lt;br /&gt;
    end&lt;br /&gt;
    Q := build_global_heap(S, q)&lt;br /&gt;
    while size(Q) &amp;gt; k do&lt;br /&gt;
    begin&lt;br /&gt;
        u := extract_max(Q)&lt;br /&gt;
        v := max(q[u])&lt;br /&gt;
        delete(Q, v)&lt;br /&gt;
        w := merge(u, v)&lt;br /&gt;
        for each x in q[u] or q[v] do&lt;br /&gt;
        begin&lt;br /&gt;
            link[x, w] := link[x, u] + link[x, v]&lt;br /&gt;
            delete(q[x], u)&lt;br /&gt;
            delete(q[x], v)&lt;br /&gt;
            insert(q[x], w, g(x, w))&lt;br /&gt;
            insert(q[w], x, g(x, w))&lt;br /&gt;
            update(Q, x, q[x])&lt;br /&gt;
        end&lt;br /&gt;
        insert(Q, w, q[w])&lt;br /&gt;
        deallocate(q[u])&lt;br /&gt;
        deallocate(q[v])&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Временная сложность&#039;&#039;&#039;:&lt;br /&gt;
*Инициализация глобальной кучи - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Инициализация локальной кучи - требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Вычисление связей между парой точек - в худшем случае алгоритмом Штрассена вычисляется за &amp;lt;math&amp;gt;O(n*n^{2.37})&amp;lt;/math&amp;gt;, в среднем за &amp;lt;math&amp;gt;O(n m_\alpha m_m)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Построение каждой кучи - &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Сортировка каждой кучи -  &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Основной цикл объединения кластеров выполняется в &amp;lt;math&amp;gt;n-k&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
**Вставить новый кластер в в &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt; локальных куч размера &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt; &lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(n^2 + n m_m m_a + n^2 \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Сложность по памяти&#039;&#039;&#039;:&lt;br /&gt;
*Поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей, то общие затраты памяти не превышают &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Хранение связей - &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt; &#039;&#039;(поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей)&#039;&#039;&lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(\min \{ n^2, n m_m m_a \} )&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма == &lt;br /&gt;
&amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - количество процессов.&lt;br /&gt;
&lt;br /&gt;
*Параллельное построение начальной кучи (функция &amp;lt;math&amp;gt;build\_local\_heap&amp;lt;/math&amp;gt;) -  &amp;lt;math&amp;gt;\frac{n}{p}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Входные данные алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;&lt;br /&gt;
*Целевое количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Гиперпараметры алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Пороговое значение схожести &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt;&lt;br /&gt;
*Функция ожидания количества соседей &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Результат:&#039;&#039;&#039;&lt;br /&gt;
*Метка кластера для каждого объекта&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Divanov</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=11927</id>
		<title>Участник:Иванов Даниил/Алгоритм устойчивой кластеризации с иcпользованием связей</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=11927"/>
		<updated>2016-10-15T20:45:14Z</updated>

		<summary type="html">&lt;p&gt;Divanov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Вступление&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
:Алгоритм устойчивой кластеризации с иcпользованием связей (&#039;&#039;&#039;robust clustering using links&#039;&#039;&#039;, &#039;&#039;ROCK&#039;&#039;) решает задачу [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F кластеризации] объектов по заранее заданному количеству &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. В пространстве объектов должна быть определена функция сходства/расстояния между объекта &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;. Данный алгоритм относится к иерархическим методам кластеризации, который начинает с разбиения пространства на большое количество кластеров и постепенно объединяя их до нужного количества. Алгоритм пытается объединить в один кластер точки с максимальным числом общих соседей.&lt;br /&gt;
&lt;br /&gt;
:Данный алгоритм хорошо подходит для объектов с категориальными признаками (то есть признаками, принимающими небольшое количество значений). С помощью этого алгоритма также часто решается задача [https://en.wikipedia.org/wiki/Association_rule_learning поиска ассоциативных правил].&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
:Пусть дано множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;, натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;, пороговое значение &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt; и функция функция &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
:Результатом работы алгоритма является &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; непересекающихся кластеров, делящих множество &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Две точки называются &#039;&#039;соседними&#039;&#039;, если &amp;lt;math&amp;gt;sim(p_i, p_j) \geq \theta&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Количеством общих соседей &amp;lt;math&amp;gt;link(p_i, p_j)&amp;lt;/math&amp;gt; называется число точек, являющимися соседними для точек &amp;lt;math&amp;gt;p_i, p_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией связи между кластерами называется &amp;lt;math&amp;gt;link[C_i, C_j] = \sum_{\begin{smallmatrix}p_q\in C_i,\; p_r\in C_j\end{smallmatrix}}^{ } link(p_{q},p_r)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией качества является функция&lt;br /&gt;
:&amp;lt;math&amp;gt; g(C_i, C_j) = \frac{link[C_i,C_j]}{(n_i + n_j)^{1 + 2f(\theta )} - n_i^{1+2f(\theta )} - n_j^{1+2f(\theta )}}&amp;lt;/math&amp;gt;,  где &amp;lt;math&amp;gt;n_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;n&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
:Затем на каждом шаге он вычисляет значение &amp;lt;math&amp;gt;g(C_i, C_j)&amp;lt;/math&amp;gt; для каждой пары кластеров и объединяет эти кластеры в один.&lt;br /&gt;
:Алгоритм ведёт свою работу до тех пор, пока не получит &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:В качестве функции &amp;lt;math&amp;gt;f( \theta )&amp;lt;/math&amp;gt; обычно используется функция &amp;lt;math&amp;gt;f(\theta ) = \frac{\theta - 1}{\theta + 1}&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;n_i^{1+2f(\theta )}&amp;lt;/math&amp;gt; - ожидаемое число связей между парами объектов кластера &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Если все признаки категориальны, то в качестве функции схожести можно использовать функцию:&lt;br /&gt;
:&amp;lt;math&amp;gt;sim(p_i,p_j) = \frac{|p_i\cap p_j|}{|p_i\cup p_j|}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|p_i|&amp;lt;/math&amp;gt; - количество атрибутов в &amp;lt;math&amp;gt;p_i&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-k&amp;lt;/math&amp;gt; шагов кластеры последовательно объединяются. Реализовывается с помощью структуры данных &#039;&#039;куча&#039;&#039;. Для каждого кластера math&amp;gt;i&amp;lt;/math&amp;gt; хранится своя куча &amp;lt;math&amp;gt;q[i]&amp;lt;/math&amp;gt;, содержащая все связанный с ним кластеры, упорядоченная по убыванию функции качества. Также хранится глобальная куча &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, содержащая все кластеры &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, упорядоченные по мере убывания функции качества &amp;lt;math&amp;gt;g(j, max(q[j]))&amp;lt;/math&amp;gt;. На каждом шаге итерации, после объединения кластеров требуется перестроить кучи объединённых кластеров в одну и перестроить глобальную кучу.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
:Макроструктура состоит из последовательного выполнения двух шагов, описанных в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]]:&lt;br /&gt;
# Построении матрицы связей&lt;br /&gt;
# Пересчёте куч и объединении кластеров&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация основной вычислительной части:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line&amp;gt;&lt;br /&gt;
procedure cluster(S, k)&lt;br /&gt;
begin&lt;br /&gt;
    link := compute_links(S)&lt;br /&gt;
    for s in S do&lt;br /&gt;
    begin&lt;br /&gt;
        q[s] := build_local_heap(link, s)&lt;br /&gt;
    end&lt;br /&gt;
    Q := build_global_heap(S, q)&lt;br /&gt;
    while size(Q) &amp;gt; k do&lt;br /&gt;
    begin&lt;br /&gt;
        u := extract_max(Q)&lt;br /&gt;
        v := max(q[u])&lt;br /&gt;
        delete(Q, v)&lt;br /&gt;
        w := merge(u, v)&lt;br /&gt;
        for each x in q[u] or q[v] do&lt;br /&gt;
        begin&lt;br /&gt;
            link[x, w] := link[x, u] + link[x, v]&lt;br /&gt;
            delete(q[x], u)&lt;br /&gt;
            delete(q[x], v)&lt;br /&gt;
            insert(q[x], w, g(x, w))&lt;br /&gt;
            insert(q[w], x, g(x, w))&lt;br /&gt;
            update(Q, x, q[x])&lt;br /&gt;
        end&lt;br /&gt;
        insert(Q, w, q[w])&lt;br /&gt;
        deallocate(q[u])&lt;br /&gt;
        deallocate(q[v])&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Временная сложность&#039;&#039;&#039;:&lt;br /&gt;
*Инициализация глобальной кучи - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Инициализация локальной кучи - требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Вычисление связей между парой точек - в худшем случае алгоритмом Штрассена вычисляется за &amp;lt;math&amp;gt;O(n*n^{2.37})&amp;lt;/math&amp;gt;, в среднем за &amp;lt;math&amp;gt;O(n m_\alpha m_m)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Построение каждой кучи - &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Сортировка каждой кучи -  &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Основной цикл объединения кластеров выполняется в &amp;lt;math&amp;gt;n-k&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
**Вставить новый кластер в в &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt; локальных куч размера &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt; &lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(n^2 + n m_m m_a + n^2 \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Сложность по памяти&#039;&#039;&#039;:&lt;br /&gt;
*Поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей, то общие затраты памяти не превышают &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Хранение связей - &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt; &#039;&#039;(поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей)&#039;&#039;&lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(\min \{ n^2, n m_m m_a \} )&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;
:&#039;&#039;&#039;Входные данные алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;&lt;br /&gt;
*Целевое количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Гиперпараметры алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Пороговое значение схожести &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt;&lt;br /&gt;
*Функция ожидания количества соседей &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Результат:&#039;&#039;&#039;&lt;br /&gt;
*Метка кластера для каждого объекта&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Divanov</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=11922</id>
		<title>Участник:Иванов Даниил/Алгоритм устойчивой кластеризации с иcпользованием связей</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=11922"/>
		<updated>2016-10-15T20:44:32Z</updated>

		<summary type="html">&lt;p&gt;Divanov: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Вступление&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
:Алгоритм устойчивой кластеризации с иcпользованием связей (&#039;&#039;&#039;robust clustering using links&#039;&#039;&#039;, &#039;&#039;ROCK&#039;&#039;) решает задачу [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F кластеризации] объектов по заранее заданному количеству &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. В пространстве объектов должна быть определена функция сходства/расстояния между объекта &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;. Данный алгоритм относится к иерархическим методам кластеризации, который начинает с разбиения пространства на большое количество кластеров и постепенно объединяя их до нужного количества. Алгоритм пытается объединить в один кластер точки с максимальным числом общих соседей.&lt;br /&gt;
&lt;br /&gt;
:Данный алгоритм хорошо подходит для объектов с категориальными признаками (то есть признаками, принимающими небольшое количество значений). С помощью этого алгоритма также часто решается задача [https://en.wikipedia.org/wiki/Association_rule_learning поиска ассоциативных правил].&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
:Пусть дано множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;, натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;, пороговое значение &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt; и функция функция &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
:Результатом работы алгоритма является &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; непересекающихся кластеров, делящих множество &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Две точки называются &#039;&#039;соседними&#039;&#039;, если &amp;lt;math&amp;gt;sim(p_i, p_j) \geq \theta&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Количеством общих соседей &amp;lt;math&amp;gt;link(p_i, p_j)&amp;lt;/math&amp;gt; называется число точек, являющимися соседними для точек &amp;lt;math&amp;gt;p_i, p_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией связи между кластерами называется &amp;lt;math&amp;gt;link[C_i, C_j] = \sum_{\begin{smallmatrix}p_q\in C_i,\; p_r\in C_j\end{smallmatrix}}^{ } link(p_{q},p_r)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией качества является функция&lt;br /&gt;
:&amp;lt;math&amp;gt; g(C_i, C_j) = \frac{link[C_i,C_j]}{(n_i + n_j)^{1 + 2f(\theta )} - n_i^{1+2f(\theta )} - n_j^{1+2f(\theta )}}&amp;lt;/math&amp;gt;,  где &amp;lt;math&amp;gt;n_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;n&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
:Затем на каждом шаге он вычисляет значение &amp;lt;math&amp;gt;g(C_i, C_j)&amp;lt;/math&amp;gt; для каждой пары кластеров и объединяет эти кластеры в один.&lt;br /&gt;
:Алгоритм ведёт свою работу до тех пор, пока не получит &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:В качестве функции &amp;lt;math&amp;gt;f( \theta )&amp;lt;/math&amp;gt; обычно используется функция &amp;lt;math&amp;gt;f(\theta ) = \frac{\theta - 1}{\theta + 1}&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;n_i^{1+2f(\theta )}&amp;lt;/math&amp;gt; - ожидаемое число связей между парами объектов кластера &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Если все признаки категориальны, то в качестве функции схожести можно использовать функцию:&lt;br /&gt;
:&amp;lt;math&amp;gt;sim(p_i,p_j) = \frac{|p_i\cap p_j|}{|p_i\cup p_j|}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|p_i|&amp;lt;/math&amp;gt; - количество атрибутов в &amp;lt;math&amp;gt;p_i&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-k&amp;lt;/math&amp;gt; шагов кластеры последовательно объединяются. Реализовывается с помощью структуры данных &#039;&#039;куча&#039;&#039;. Для каждого кластера math&amp;gt;i&amp;lt;/math&amp;gt; хранится своя куча &amp;lt;math&amp;gt;q[i]&amp;lt;/math&amp;gt;, содержащая все связанный с ним кластеры, упорядоченная по убыванию функции качества. Также хранится глобальная куча &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, содержащая все кластеры &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, упорядоченные по мере убывания функции качества &amp;lt;math&amp;gt;g(j, max(q[j]))&amp;lt;/math&amp;gt;. На каждом шаге итерации, после объединения кластеров требуется перестроить кучи объединённых кластеров в одну и перестроить глобальную кучу.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
:Макроструктура состоит из последовательного выполнения двух шагов, описанных в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]]:&lt;br /&gt;
# Построении матрицы связей&lt;br /&gt;
# Пересчёте куч и объединении кластеров&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация основной вычислительной части:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line&amp;gt;&lt;br /&gt;
procedure cluster(S, k)&lt;br /&gt;
begin&lt;br /&gt;
    link := compute_links(S)&lt;br /&gt;
    for s in S do&lt;br /&gt;
    begin&lt;br /&gt;
        q[s] := build_local_heap(link, s)&lt;br /&gt;
    end&lt;br /&gt;
    Q := build_global_heap(S, q)&lt;br /&gt;
    while size(Q) &amp;gt; k do&lt;br /&gt;
    begin&lt;br /&gt;
        u := extract_max(Q)&lt;br /&gt;
        v := max(q[u])&lt;br /&gt;
        delete(Q, v)&lt;br /&gt;
        w := merge(u, v)&lt;br /&gt;
        for each x in q[u] or q[v] do&lt;br /&gt;
        begin&lt;br /&gt;
            link[x, w] := link[x, u] + link[x, v]&lt;br /&gt;
            delete(q[x], u)&lt;br /&gt;
            delete(q[x], v)&lt;br /&gt;
            insert(q[x], w, g(x, w))&lt;br /&gt;
            insert(q[w], x, g(x, w))&lt;br /&gt;
            update(Q, x, q[x])&lt;br /&gt;
        end&lt;br /&gt;
        insert(Q, w, q[w])&lt;br /&gt;
        deallocate(q[u])&lt;br /&gt;
        deallocate(q[v])&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Временная сложность&#039;&#039;&#039;:&lt;br /&gt;
*Инициализация глобальной кучи - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Инициализация локальной кучи - требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Вычисление связей между парой точек - в худшем случае алгоритмом Штрассена вычисляется за &amp;lt;math&amp;gt;O(n*n^{2.37})&amp;lt;/math&amp;gt;, в среднем за &amp;lt;math&amp;gt;O(n m_\alpha m_m)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Построение каждой кучи - &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Сортировка каждой кучи -  &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Основной цикл объединения кластеров выполняется в &amp;lt;math&amp;gt;n-k&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
**Вставить новый кластер в в &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt; локальных куч размера &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt; &lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(n^2 + n m_m m_a + n^2 \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Сложность по памяти&#039;&#039;&#039;:&lt;br /&gt;
*Поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей, то общие затраты памяти не превышают &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Хранение связей - &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt; &#039;&#039;(поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей)&#039;&#039;&lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(\min \{ n^2, n m_m m_a \} )&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Входные данные алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;&lt;br /&gt;
*Целевое количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Гиперпараметры алгоритма:&#039;&#039;&#039;&lt;br /&gt;
*Функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Пороговое значение схожести &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt;&lt;br /&gt;
*Функция ожидания количества соседей &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Результат:&#039;&#039;&#039;&lt;br /&gt;
*Метка кластера для каждого объекта&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Divanov</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=11914</id>
		<title>Участник:Иванов Даниил/Алгоритм устойчивой кластеризации с иcпользованием связей</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=11914"/>
		<updated>2016-10-15T20:43:49Z</updated>

		<summary type="html">&lt;p&gt;Divanov: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Вступление&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
:Алгоритм устойчивой кластеризации с иcпользованием связей (&#039;&#039;&#039;robust clustering using links&#039;&#039;&#039;, &#039;&#039;ROCK&#039;&#039;) решает задачу [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F кластеризации] объектов по заранее заданному количеству &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. В пространстве объектов должна быть определена функция сходства/расстояния между объекта &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;. Данный алгоритм относится к иерархическим методам кластеризации, который начинает с разбиения пространства на большое количество кластеров и постепенно объединяя их до нужного количества. Алгоритм пытается объединить в один кластер точки с максимальным числом общих соседей.&lt;br /&gt;
&lt;br /&gt;
:Данный алгоритм хорошо подходит для объектов с категориальными признаками (то есть признаками, принимающими небольшое количество значений). С помощью этого алгоритма также часто решается задача [https://en.wikipedia.org/wiki/Association_rule_learning поиска ассоциативных правил].&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
:Пусть дано множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;, натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;, пороговое значение &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt; и функция функция &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
:Результатом работы алгоритма является &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; непересекающихся кластеров, делящих множество &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Две точки называются &#039;&#039;соседними&#039;&#039;, если &amp;lt;math&amp;gt;sim(p_i, p_j) \geq \theta&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Количеством общих соседей &amp;lt;math&amp;gt;link(p_i, p_j)&amp;lt;/math&amp;gt; называется число точек, являющимися соседними для точек &amp;lt;math&amp;gt;p_i, p_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией связи между кластерами называется &amp;lt;math&amp;gt;link[C_i, C_j] = \sum_{\begin{smallmatrix}p_q\in C_i,\; p_r\in C_j\end{smallmatrix}}^{ } link(p_{q},p_r)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией качества является функция&lt;br /&gt;
:&amp;lt;math&amp;gt; g(C_i, C_j) = \frac{link[C_i,C_j]}{(n_i + n_j)^{1 + 2f(\theta )} - n_i^{1+2f(\theta )} - n_j^{1+2f(\theta )}}&amp;lt;/math&amp;gt;,  где &amp;lt;math&amp;gt;n_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;n&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
:Затем на каждом шаге он вычисляет значение &amp;lt;math&amp;gt;g(C_i, C_j)&amp;lt;/math&amp;gt; для каждой пары кластеров и объединяет эти кластеры в один.&lt;br /&gt;
:Алгоритм ведёт свою работу до тех пор, пока не получит &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:В качестве функции &amp;lt;math&amp;gt;f( \theta )&amp;lt;/math&amp;gt; обычно используется функция &amp;lt;math&amp;gt;f(\theta ) = \frac{\theta - 1}{\theta + 1}&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;n_i^{1+2f(\theta )}&amp;lt;/math&amp;gt; - ожидаемое число связей между парами объектов кластера &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Если все признаки категориальны, то в качестве функции схожести можно использовать функцию:&lt;br /&gt;
:&amp;lt;math&amp;gt;sim(p_i,p_j) = \frac{|p_i\cap p_j|}{|p_i\cup p_j|}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|p_i|&amp;lt;/math&amp;gt; - количество атрибутов в &amp;lt;math&amp;gt;p_i&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-k&amp;lt;/math&amp;gt; шагов кластеры последовательно объединяются. Реализовывается с помощью структуры данных &#039;&#039;куча&#039;&#039;. Для каждого кластера math&amp;gt;i&amp;lt;/math&amp;gt; хранится своя куча &amp;lt;math&amp;gt;q[i]&amp;lt;/math&amp;gt;, содержащая все связанный с ним кластеры, упорядоченная по убыванию функции качества. Также хранится глобальная куча &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, содержащая все кластеры &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, упорядоченные по мере убывания функции качества &amp;lt;math&amp;gt;g(j, max(q[j]))&amp;lt;/math&amp;gt;. На каждом шаге итерации, после объединения кластеров требуется перестроить кучи объединённых кластеров в одну и перестроить глобальную кучу.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
:Макроструктура состоит из последовательного выполнения двух шагов, описанных в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]]:&lt;br /&gt;
# Построении матрицы связей&lt;br /&gt;
# Пересчёте куч и объединении кластеров&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация основной вычислительной части:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line&amp;gt;&lt;br /&gt;
procedure cluster(S, k)&lt;br /&gt;
begin&lt;br /&gt;
    link := compute_links(S)&lt;br /&gt;
    for s in S do&lt;br /&gt;
    begin&lt;br /&gt;
        q[s] := build_local_heap(link, s)&lt;br /&gt;
    end&lt;br /&gt;
    Q := build_global_heap(S, q)&lt;br /&gt;
    while size(Q) &amp;gt; k do&lt;br /&gt;
    begin&lt;br /&gt;
        u := extract_max(Q)&lt;br /&gt;
        v := max(q[u])&lt;br /&gt;
        delete(Q, v)&lt;br /&gt;
        w := merge(u, v)&lt;br /&gt;
        for each x in q[u] or q[v] do&lt;br /&gt;
        begin&lt;br /&gt;
            link[x, w] := link[x, u] + link[x, v]&lt;br /&gt;
            delete(q[x], u)&lt;br /&gt;
            delete(q[x], v)&lt;br /&gt;
            insert(q[x], w, g(x, w))&lt;br /&gt;
            insert(q[w], x, g(x, w))&lt;br /&gt;
            update(Q, x, q[x])&lt;br /&gt;
        end&lt;br /&gt;
        insert(Q, w, q[w])&lt;br /&gt;
        deallocate(q[u])&lt;br /&gt;
        deallocate(q[v])&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Временная сложность&#039;&#039;&#039;:&lt;br /&gt;
*Инициализация глобальной кучи - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Инициализация локальной кучи - требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Вычисление связей между парой точек - в худшем случае алгоритмом Штрассена вычисляется за &amp;lt;math&amp;gt;O(n*n^{2.37})&amp;lt;/math&amp;gt;, в среднем за &amp;lt;math&amp;gt;O(n m_\alpha m_m)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Построение каждой кучи - &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Сортировка каждой кучи -  &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Основной цикл объединения кластеров выполняется в &amp;lt;math&amp;gt;n-k&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
**Вставить новый кластер в в &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt; локальных куч размера &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt; &lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(n^2 + n m_m m_a + n^2 \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Сложность по памяти&#039;&#039;&#039;:&lt;br /&gt;
*Поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей, то общие затраты памяти не превышают &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Хранение связей - &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt; &#039;&#039;(поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей)&#039;&#039;&lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(\min \{ n^2, n m_m m_a \} )&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;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;&lt;br /&gt;
*Целевое количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Гиперпараметры алгоритма:&lt;br /&gt;
*Функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Пороговое значение схожести &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt;&lt;br /&gt;
*Функция ожидания количества соседей &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Результат:&lt;br /&gt;
*Метка кластера для каждого объекта&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Divanov</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=11910</id>
		<title>Участник:Иванов Даниил/Алгоритм устойчивой кластеризации с иcпользованием связей</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=11910"/>
		<updated>2016-10-15T20:43:35Z</updated>

		<summary type="html">&lt;p&gt;Divanov: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Вступление&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
:Алгоритм устойчивой кластеризации с иcпользованием связей (&#039;&#039;&#039;robust clustering using links&#039;&#039;&#039;, &#039;&#039;ROCK&#039;&#039;) решает задачу [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F кластеризации] объектов по заранее заданному количеству &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. В пространстве объектов должна быть определена функция сходства/расстояния между объекта &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;. Данный алгоритм относится к иерархическим методам кластеризации, который начинает с разбиения пространства на большое количество кластеров и постепенно объединяя их до нужного количества. Алгоритм пытается объединить в один кластер точки с максимальным числом общих соседей.&lt;br /&gt;
&lt;br /&gt;
:Данный алгоритм хорошо подходит для объектов с категориальными признаками (то есть признаками, принимающими небольшое количество значений). С помощью этого алгоритма также часто решается задача [https://en.wikipedia.org/wiki/Association_rule_learning поиска ассоциативных правил].&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
:Пусть дано множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;, натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;, пороговое значение &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt; и функция функция &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
:Результатом работы алгоритма является &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; непересекающихся кластеров, делящих множество &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Две точки называются &#039;&#039;соседними&#039;&#039;, если &amp;lt;math&amp;gt;sim(p_i, p_j) \geq \theta&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Количеством общих соседей &amp;lt;math&amp;gt;link(p_i, p_j)&amp;lt;/math&amp;gt; называется число точек, являющимися соседними для точек &amp;lt;math&amp;gt;p_i, p_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией связи между кластерами называется &amp;lt;math&amp;gt;link[C_i, C_j] = \sum_{\begin{smallmatrix}p_q\in C_i,\; p_r\in C_j\end{smallmatrix}}^{ } link(p_{q},p_r)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией качества является функция&lt;br /&gt;
:&amp;lt;math&amp;gt; g(C_i, C_j) = \frac{link[C_i,C_j]}{(n_i + n_j)^{1 + 2f(\theta )} - n_i^{1+2f(\theta )} - n_j^{1+2f(\theta )}}&amp;lt;/math&amp;gt;,  где &amp;lt;math&amp;gt;n_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;n&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
:Затем на каждом шаге он вычисляет значение &amp;lt;math&amp;gt;g(C_i, C_j)&amp;lt;/math&amp;gt; для каждой пары кластеров и объединяет эти кластеры в один.&lt;br /&gt;
:Алгоритм ведёт свою работу до тех пор, пока не получит &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:В качестве функции &amp;lt;math&amp;gt;f( \theta )&amp;lt;/math&amp;gt; обычно используется функция &amp;lt;math&amp;gt;f(\theta ) = \frac{\theta - 1}{\theta + 1}&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;n_i^{1+2f(\theta )}&amp;lt;/math&amp;gt; - ожидаемое число связей между парами объектов кластера &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Если все признаки категориальны, то в качестве функции схожести можно использовать функцию:&lt;br /&gt;
:&amp;lt;math&amp;gt;sim(p_i,p_j) = \frac{|p_i\cap p_j|}{|p_i\cup p_j|}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|p_i|&amp;lt;/math&amp;gt; - количество атрибутов в &amp;lt;math&amp;gt;p_i&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-k&amp;lt;/math&amp;gt; шагов кластеры последовательно объединяются. Реализовывается с помощью структуры данных &#039;&#039;куча&#039;&#039;. Для каждого кластера math&amp;gt;i&amp;lt;/math&amp;gt; хранится своя куча &amp;lt;math&amp;gt;q[i]&amp;lt;/math&amp;gt;, содержащая все связанный с ним кластеры, упорядоченная по убыванию функции качества. Также хранится глобальная куча &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, содержащая все кластеры &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, упорядоченные по мере убывания функции качества &amp;lt;math&amp;gt;g(j, max(q[j]))&amp;lt;/math&amp;gt;. На каждом шаге итерации, после объединения кластеров требуется перестроить кучи объединённых кластеров в одну и перестроить глобальную кучу.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
:Макроструктура состоит из последовательного выполнения двух шагов, описанных в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]]:&lt;br /&gt;
# Построении матрицы связей&lt;br /&gt;
# Пересчёте куч и объединении кластеров&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация основной вычислительной части:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line&amp;gt;&lt;br /&gt;
procedure cluster(S, k)&lt;br /&gt;
begin&lt;br /&gt;
    link := compute_links(S)&lt;br /&gt;
    for s in S do&lt;br /&gt;
    begin&lt;br /&gt;
        q[s] := build_local_heap(link, s)&lt;br /&gt;
    end&lt;br /&gt;
    Q := build_global_heap(S, q)&lt;br /&gt;
    while size(Q) &amp;gt; k do&lt;br /&gt;
    begin&lt;br /&gt;
        u := extract_max(Q)&lt;br /&gt;
        v := max(q[u])&lt;br /&gt;
        delete(Q, v)&lt;br /&gt;
        w := merge(u, v)&lt;br /&gt;
        for each x in q[u] or q[v] do&lt;br /&gt;
        begin&lt;br /&gt;
            link[x, w] := link[x, u] + link[x, v]&lt;br /&gt;
            delete(q[x], u)&lt;br /&gt;
            delete(q[x], v)&lt;br /&gt;
            insert(q[x], w, g(x, w))&lt;br /&gt;
            insert(q[w], x, g(x, w))&lt;br /&gt;
            update(Q, x, q[x])&lt;br /&gt;
        end&lt;br /&gt;
        insert(Q, w, q[w])&lt;br /&gt;
        deallocate(q[u])&lt;br /&gt;
        deallocate(q[v])&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Временная сложность&#039;&#039;&#039;:&lt;br /&gt;
*Инициализация глобальной кучи - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Инициализация локальной кучи - требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Вычисление связей между парой точек - в худшем случае алгоритмом Штрассена вычисляется за &amp;lt;math&amp;gt;O(n*n^{2.37})&amp;lt;/math&amp;gt;, в среднем за &amp;lt;math&amp;gt;O(n m_\alpha m_m)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Построение каждой кучи - &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Сортировка каждой кучи -  &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Основной цикл объединения кластеров выполняется в &amp;lt;math&amp;gt;n-k&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
**Вставить новый кластер в в &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt; локальных куч размера &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt; &lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(n^2 + n m_m m_a + n^2 \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Сложность по памяти&#039;&#039;&#039;:&lt;br /&gt;
*Поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей, то общие затраты памяти не превышают &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Хранение связей - &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt; &#039;&#039;(поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей)&#039;&#039;&lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(\min \{ n^2, n m_m m_a \} )&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;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;&lt;br /&gt;
*Целевое количество кластеров&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Гиперпараметры алгоритма:&lt;br /&gt;
*Функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Пороговое значение схожести &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt;&lt;br /&gt;
*Функция ожидания количества соседей &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Результат:&lt;br /&gt;
*Метка кластера для каждого объекта&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Divanov</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=11861</id>
		<title>Участник:Иванов Даниил/Алгоритм устойчивой кластеризации с иcпользованием связей</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=11861"/>
		<updated>2016-10-15T20:38:45Z</updated>

		<summary type="html">&lt;p&gt;Divanov: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Вступление&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
:Алгоритм устойчивой кластеризации с иcпользованием связей (&#039;&#039;&#039;robust clustering using links&#039;&#039;&#039;, &#039;&#039;ROCK&#039;&#039;) решает задачу [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F кластеризации] объектов по заранее заданному количеству &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. В пространстве объектов должна быть определена функция сходства/расстояния между объекта &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;. Данный алгоритм относится к иерархическим методам кластеризации, который начинает с разбиения пространства на большое количество кластеров и постепенно объединяя их до нужного количества. Алгоритм пытается объединить в один кластер точки с максимальным числом общих соседей.&lt;br /&gt;
&lt;br /&gt;
:Данный алгоритм хорошо подходит для объектов с категориальными признаками (то есть признаками, принимающими небольшое количество значений). С помощью этого алгоритма также часто решается задача [https://en.wikipedia.org/wiki/Association_rule_learning поиска ассоциативных правил].&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
:Пусть дано множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;, натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;, пороговое значение &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt; и функция функция &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
:Результатом работы алгоритма является &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; непересекающихся кластеров, делящих множество &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Две точки называются &#039;&#039;соседними&#039;&#039;, если &amp;lt;math&amp;gt;sim(p_i, p_j) \geq \theta&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Количеством общих соседей &amp;lt;math&amp;gt;link(p_i, p_j)&amp;lt;/math&amp;gt; называется число точек, являющимися соседними для точек &amp;lt;math&amp;gt;p_i, p_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией связи между кластерами называется &amp;lt;math&amp;gt;link[C_i, C_j] = \sum_{\begin{smallmatrix}p_q\in C_i,\; p_r\in C_j\end{smallmatrix}}^{ } link(p_{q},p_r)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией качества является функция&lt;br /&gt;
:&amp;lt;math&amp;gt; g(C_i, C_j) = \frac{link[C_i,C_j]}{(n_i + n_j)^{1 + 2f(\theta )} - n_i^{1+2f(\theta )} - n_j^{1+2f(\theta )}}&amp;lt;/math&amp;gt;,  где &amp;lt;math&amp;gt;n_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;n&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
:Затем на каждом шаге он вычисляет значение &amp;lt;math&amp;gt;g(C_i, C_j)&amp;lt;/math&amp;gt; для каждой пары кластеров и объединяет эти кластеры в один.&lt;br /&gt;
:Алгоритм ведёт свою работу до тех пор, пока не получит &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:В качестве функции &amp;lt;math&amp;gt;f( \theta )&amp;lt;/math&amp;gt; обычно используется функция &amp;lt;math&amp;gt;f(\theta ) = \frac{\theta - 1}{\theta + 1}&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;n_i^{1+2f(\theta )}&amp;lt;/math&amp;gt; - ожидаемое число связей между парами объектов кластера &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Если все признаки категориальны, то в качестве функции схожести можно использовать функцию:&lt;br /&gt;
:&amp;lt;math&amp;gt;sim(p_i,p_j) = \frac{|p_i\cap p_j|}{|p_i\cup p_j|}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|p_i|&amp;lt;/math&amp;gt; - количество атрибутов в &amp;lt;math&amp;gt;p_i&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-k&amp;lt;/math&amp;gt; шагов кластеры последовательно объединяются. Реализовывается с помощью структуры данных &#039;&#039;куча&#039;&#039;. Для каждого кластера math&amp;gt;i&amp;lt;/math&amp;gt; хранится своя куча &amp;lt;math&amp;gt;q[i]&amp;lt;/math&amp;gt;, содержащая все связанный с ним кластеры, упорядоченная по убыванию функции качества. Также хранится глобальная куча &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, содержащая все кластеры &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, упорядоченные по мере убывания функции качества &amp;lt;math&amp;gt;g(j, max(q[j]))&amp;lt;/math&amp;gt;. На каждом шаге итерации, после объединения кластеров требуется перестроить кучи объединённых кластеров в одну и перестроить глобальную кучу.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
:Макроструктура состоит из последовательного выполнения двух шагов, описанных в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]]:&lt;br /&gt;
# Построении матрицы связей&lt;br /&gt;
# Пересчёте куч и объединении кластеров&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация основной вычислительной части:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line&amp;gt;&lt;br /&gt;
procedure cluster(S, k)&lt;br /&gt;
begin&lt;br /&gt;
    link := compute_links(S)&lt;br /&gt;
    for s in S do&lt;br /&gt;
    begin&lt;br /&gt;
        q[s] := build_local_heap(link, s)&lt;br /&gt;
    end&lt;br /&gt;
    Q := build_global_heap(S, q)&lt;br /&gt;
    while size(Q) &amp;gt; k do&lt;br /&gt;
    begin&lt;br /&gt;
        u := extract_max(Q)&lt;br /&gt;
        v := max(q[u])&lt;br /&gt;
        delete(Q, v)&lt;br /&gt;
        w := merge(u, v)&lt;br /&gt;
        for each x in q[u] or q[v] do&lt;br /&gt;
        begin&lt;br /&gt;
            link[x, w] := link[x, u] + link[x, v]&lt;br /&gt;
            delete(q[x], u)&lt;br /&gt;
            delete(q[x], v)&lt;br /&gt;
            insert(q[x], w, g(x, w))&lt;br /&gt;
            insert(q[w], x, g(x, w))&lt;br /&gt;
            update(Q, x, q[x])&lt;br /&gt;
        end&lt;br /&gt;
        insert(Q, w, q[w])&lt;br /&gt;
        deallocate(q[u])&lt;br /&gt;
        deallocate(q[v])&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
:&#039;&#039;&#039;Временная сложность&#039;&#039;&#039;:&lt;br /&gt;
*Инициализация глобальной кучи - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Инициализация локальной кучи - требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Вычисление связей между парой точек - в худшем случае алгоритмом Штрассена вычисляется за &amp;lt;math&amp;gt;O(n*n^{2.37})&amp;lt;/math&amp;gt;, в среднем за &amp;lt;math&amp;gt;O(n m_\alpha m_m)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Построение каждой кучи - &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Сортировка каждой кучи -  &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
*Основной цикл объединения кластеров выполняется в &amp;lt;math&amp;gt;n-k&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
**Вставить новый кластер в в &amp;lt;math&amp;gt; O(n)&amp;lt;/math&amp;gt; локальных куч размера &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt; O( n \log{} n)&amp;lt;/math&amp;gt; &lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(n^2 + n m_m m_a + n^2 \log{} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Сложность по памяти&#039;&#039;&#039;:&lt;br /&gt;
*Поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей, то общие затраты памяти не превышают &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt;.&lt;br /&gt;
*Хранение связей - &amp;lt;math&amp;gt; O(\min \{  n m_m m_a, n^2 \} )&amp;lt;/math&amp;gt; &#039;&#039;(поскольку каждая точка &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; может иметь не более &amp;lt;math&amp;gt;\min \{  m_m m_i, n \} )&amp;lt;/math&amp;gt; связей)&#039;&#039;&lt;br /&gt;
Итого:&lt;br /&gt;
&amp;lt;math&amp;gt; O(\min \{ n^2, n m_m m_a \} )&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Divanov</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=11572</id>
		<title>Участник:Иванов Даниил/Алгоритм устойчивой кластеризации с иcпользованием связей</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=11572"/>
		<updated>2016-10-15T19:53:25Z</updated>

		<summary type="html">&lt;p&gt;Divanov: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Вступление&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
:Алгоритм устойчивой кластеризации с иcпользованием связей (&#039;&#039;&#039;robust clustering using links&#039;&#039;&#039;, &#039;&#039;ROCK&#039;&#039;) решает задачу [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F кластеризации] объектов по заранее заданному количеству &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. В пространстве объектов должна быть определена функция сходства/расстояния между объекта &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;. Данный алгоритм относится к иерархическим методам кластеризации, который начинает с разбиения пространства на большое количество кластеров и постепенно объединяя их до нужного количества. Алгоритм пытается объединить в один кластер точки с максимальным числом общих соседей.&lt;br /&gt;
&lt;br /&gt;
:Данный алгоритм хорошо подходит для объектов с категориальными признаками (то есть признаками, принимающими небольшое количество значений). С помощью этого алгоритма также часто решается задача [https://en.wikipedia.org/wiki/Association_rule_learning поиска ассоциативных правил].&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
:Пусть дано множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;, натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;, пороговое значение &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt; и функция функция &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
:Результатом работы алгоритма является &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; непересекающихся кластеров, делящих множество &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Две точки называются &#039;&#039;соседними&#039;&#039;, если &amp;lt;math&amp;gt;sim(p_i, p_j) \geq \theta&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Количеством общих соседей &amp;lt;math&amp;gt;link(p_i, p_j)&amp;lt;/math&amp;gt; называется число точек, являющимися соседними для точек &amp;lt;math&amp;gt;p_i, p_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией связи между кластерами называется &amp;lt;math&amp;gt;link[C_i, C_j] = \sum_{\begin{smallmatrix}p_q\in C_i,\; p_r\in C_j\end{smallmatrix}}^{ } link(p_{q},p_r)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией качества является функция&lt;br /&gt;
:&amp;lt;math&amp;gt; g(C_i, C_j) = \frac{link[C_i,C_j]}{(n_i + n_j)^{1 + 2f(\theta )} - n_i^{1+2f(\theta )} - n_j^{1+2f(\theta )}}&amp;lt;/math&amp;gt;,  где &amp;lt;math&amp;gt;n_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;n&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
:Затем на каждом шаге он вычисляет значение &amp;lt;math&amp;gt;g(C_i, C_j)&amp;lt;/math&amp;gt; для каждой пары кластеров и объединяет эти кластеры в один.&lt;br /&gt;
:Алгоритм ведёт свою работу до тех пор, пока не получит &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:В качестве функции &amp;lt;math&amp;gt;f( \theta )&amp;lt;/math&amp;gt; обычно используется функция &amp;lt;math&amp;gt;f(\theta ) = \frac{\theta - 1}{\theta + 1}&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;n_i^{1+2f(\theta )}&amp;lt;/math&amp;gt; - ожидаемое число связей между парами объектов кластера &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Если все признаки категориальны, то в качестве функции схожести можно использовать функцию:&lt;br /&gt;
:&amp;lt;math&amp;gt;sim(p_i,p_j) = \frac{|p_i\cap p_j|}{|p_i\cup p_j|}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|p_i|&amp;lt;/math&amp;gt; - количество атрибутов в &amp;lt;math&amp;gt;p_i&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-k&amp;lt;/math&amp;gt; шагов кластеры последовательно объединяются. Реализовывается с помощью структуры данных &#039;&#039;куча&#039;&#039;. Для каждого кластера math&amp;gt;i&amp;lt;/math&amp;gt; хранится своя куча &amp;lt;math&amp;gt;q[i]&amp;lt;/math&amp;gt;, содержащая все связанный с ним кластеры, упорядоченная по убыванию функции качества. Также хранится глобальная куча &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, содержащая все кластеры &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, упорядоченные по мере убывания функции качества &amp;lt;math&amp;gt;g(j, max(q[j]))&amp;lt;/math&amp;gt;. На каждом шаге итерации, после объединения кластеров требуется перестроить кучи объединённых кластеров в одну и перестроить глобальную кучу.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
:Макроструктура состоит из последовательного выполнения двух шагов, описанных в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]]:&lt;br /&gt;
# Построении матрицы связей&lt;br /&gt;
# Пересчёте куч и объединении кластеров&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация основной вычислительной части:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot; line&amp;gt;&lt;br /&gt;
procedure cluster(S, k)&lt;br /&gt;
begin&lt;br /&gt;
    link := compute_links(S)&lt;br /&gt;
    for s in S do&lt;br /&gt;
    begin&lt;br /&gt;
        q[s] := build_local_heap(link, s)&lt;br /&gt;
    end&lt;br /&gt;
    Q := build_global_heap(S, q)&lt;br /&gt;
    while size(Q) &amp;gt; k do&lt;br /&gt;
    begin&lt;br /&gt;
        u := extract_max(Q)&lt;br /&gt;
        v := max(q[u])&lt;br /&gt;
        delete(Q, v)&lt;br /&gt;
        w := merge(u, v)&lt;br /&gt;
        for each x in q[u] or q[v] do&lt;br /&gt;
        begin&lt;br /&gt;
            link[x, w] := link[x, u] + link[x, v]&lt;br /&gt;
            delete(q[x], u)&lt;br /&gt;
            delete(q[x], v)&lt;br /&gt;
            insert(q[x], w, g(x, w))&lt;br /&gt;
            insert(q[w], x, g(x, w))&lt;br /&gt;
            update(Q, x, q[x])&lt;br /&gt;
        end&lt;br /&gt;
        insert(Q, w, q[w])&lt;br /&gt;
        deallocate(q[u])&lt;br /&gt;
        deallocate(q[v])&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Divanov</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=11442</id>
		<title>Участник:Иванов Даниил/Алгоритм устойчивой кластеризации с иcпользованием связей</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=11442"/>
		<updated>2016-10-15T19:31:10Z</updated>

		<summary type="html">&lt;p&gt;Divanov: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Вступление&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
:Алгоритм устойчивой кластеризации с иcпользованием связей (&#039;&#039;&#039;robust clustering using links&#039;&#039;&#039;, &#039;&#039;ROCK&#039;&#039;) решает задачу [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F кластеризации] объектов по заранее заданному количеству &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. В пространстве объектов должна быть определена функция сходства/расстояния между объекта &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;. Данный алгоритм относится к иерархическим методам кластеризации, который начинает с разбиения пространства на большое количество кластеров и постепенно объединяя их до нужного количества. Алгоритм пытается объединить в один кластер точки с максимальным числом общих соседей.&lt;br /&gt;
&lt;br /&gt;
:Данный алгоритм хорошо подходит для объектов с категориальными признаками (то есть признаками, принимающими небольшое количество значений). С помощью этого алгоритма также часто решается задача [https://en.wikipedia.org/wiki/Association_rule_learning поиска ассоциативных правил].&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
:Пусть дано множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;, натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;, пороговое значение &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt; и функция функция &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
:Результатом работы алгоритма является &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; непересекающихся кластеров, делящих множество &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Две точки называются &#039;&#039;соседними&#039;&#039;, если &amp;lt;math&amp;gt;sim(p_i, p_j) \geq \theta&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Количеством общих соседей &amp;lt;math&amp;gt;link(p_i, p_j)&amp;lt;/math&amp;gt; называется число точек, являющимися соседними для точек &amp;lt;math&amp;gt;p_i, p_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией связи между кластерами называется &amp;lt;math&amp;gt;link[C_i, C_j] = \sum_{\begin{smallmatrix}p_q\in C_i,\; p_r\in C_j\end{smallmatrix}}^{ } link(p_{q},p_r)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией качества является функция&lt;br /&gt;
:&amp;lt;math&amp;gt; g(C_i, C_j) = \frac{link[C_i,C_j]}{(n_i + n_j)^{1 + 2f(\theta )} - n_i^{1+2f(\theta )} - n_j^{1+2f(\theta )}}&amp;lt;/math&amp;gt;,  где &amp;lt;math&amp;gt;n_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;n&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
:Затем на каждом шаге он вычисляет значение &amp;lt;math&amp;gt;g(C_i, C_j)&amp;lt;/math&amp;gt; для каждой пары кластеров и объединяет эти кластеры в один.&lt;br /&gt;
:Алгоритм ведёт свою работу до тех пор, пока не получит &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:В качестве функции &amp;lt;math&amp;gt;f( \theta )&amp;lt;/math&amp;gt; обычно используется функция &amp;lt;math&amp;gt;f(\theta ) = \frac{\theta - 1}{\theta + 1}&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;n_i^{1+2f(\theta )}&amp;lt;/math&amp;gt; - ожидаемое число связей между парами объектов кластера &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Если все признаки категориальны, то в качестве функции схожести можно использовать функцию:&lt;br /&gt;
:&amp;lt;math&amp;gt;sim(p_i,p_j) = \frac{|p_i\cap p_j|}{|p_i\cup p_j|}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|p_i|&amp;lt;/math&amp;gt; - количество атрибутов в &amp;lt;math&amp;gt;p_i&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-k&amp;lt;/math&amp;gt; шагов кластеры последовательно объединяются. Реализовывается с помощью структуры данных &#039;&#039;куча&#039;&#039;. Для каждого кластера math&amp;gt;i&amp;lt;/math&amp;gt; хранится своя куча &amp;lt;math&amp;gt;q[i]&amp;lt;/math&amp;gt;, содержащая все связанный с ним кластеры, упорядоченная по убыванию функции качества. Также хранится глобальная куча &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, содержащая все кластеры &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, упорядоченные по мере убывания функции качества &amp;lt;math&amp;gt;g(j, max(q[j]))&amp;lt;/math&amp;gt;. На каждом шаге итерации, после объединения кластеров требуется перестроить кучи объединённых кластеров в одну и перестроить глобальную кучу.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
:Макроструктура состоит из последовательного выполнения двух шагов, описанных в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]]:&lt;br /&gt;
# Построении матрицы связей&lt;br /&gt;
# Пересчёте куч и объединении кластеров&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Divanov</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=11419</id>
		<title>Участник:Иванов Даниил/Алгоритм устойчивой кластеризации с иcпользованием связей</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=11419"/>
		<updated>2016-10-15T19:27:33Z</updated>

		<summary type="html">&lt;p&gt;Divanov: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Вступление&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
:Алгоритм устойчивой кластеризации с иcпользованием связей (&#039;&#039;&#039;robust clustering using links&#039;&#039;&#039;, &#039;&#039;ROCK&#039;&#039;) решает задачу [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F кластеризации] объектов по заранее заданному количеству &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. В пространстве объектов должна быть определена функция сходства/расстояния между объекта &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;. Данный алгоритм относится к иерархическим методам кластеризации, который начинает с разбиения пространства на большое количество кластеров и постепенно объединяя их до нужного количества. Алгоритм пытается объединить в один кластер точки с максимальным числом общих соседей.&lt;br /&gt;
&lt;br /&gt;
:Данный алгоритм хорошо подходит для объектов с категориальными признаками (то есть признаками, принимающими небольшое количество значений). С помощью этого алгоритма также часто решается задача [https://en.wikipedia.org/wiki/Association_rule_learning поиска ассоциативных правил].&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
:Пусть дано множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;, натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;, пороговое значение &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt; и функция функция &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
:Результатом работы алгоритма является &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; непересекающихся кластеров, делящих множество &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Две точки называются &#039;&#039;соседними&#039;&#039;, если &amp;lt;math&amp;gt;sim(p_i, p_j) \geq \theta&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Количеством общих соседей &amp;lt;math&amp;gt;link(p_i, p_j)&amp;lt;/math&amp;gt; называется число точек, являющимися соседними для точек &amp;lt;math&amp;gt;p_i, p_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией связи между кластерами называется &amp;lt;math&amp;gt;link[C_i, C_j] = \sum_{\begin{smallmatrix}p_q\in C_i,\; p_r\in C_j\end{smallmatrix}}^{ } link(p_{q},p_r)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией качества является функция&lt;br /&gt;
:&amp;lt;math&amp;gt; g(C_i, C_j) = \frac{link[C_i,C_j]}{(n_i + n_j)^{1 + 2f(\theta )} - n_i^{1+2f(\theta )} - n_j^{1+2f(\theta )}}&amp;lt;/math&amp;gt;,  где &amp;lt;math&amp;gt;n_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;n&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
:Затем на каждом шаге он вычисляет значение &amp;lt;math&amp;gt;g(C_i, C_j)&amp;lt;/math&amp;gt; для каждой пары кластеров и объединяет эти кластеры в один.&lt;br /&gt;
:Алгоритм ведёт свою работу до тех пор, пока не получит &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:В качестве функции &amp;lt;math&amp;gt;f( \theta )&amp;lt;/math&amp;gt; обычно используется функция &amp;lt;math&amp;gt;f(\theta ) = \frac{\theta - 1}{\theta + 1}&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;n_i^{1+2f(\theta )}&amp;lt;/math&amp;gt; - ожидаемое число связей между парами объектов кластера &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Если все признаки категориальны, то в качестве функции схожести можно использовать функцию:&lt;br /&gt;
:&amp;lt;math&amp;gt;sim(p_i,p_j) = \frac{|p_i\cap p_j|}{|p_i\cup p_j|}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|p_i|&amp;lt;/math&amp;gt; - количество атрибутов в &amp;lt;math&amp;gt;p_i&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-k&amp;lt;/math&amp;gt; шагов кластеры последовательно объединяются. Реализовывается с помощью структуры данных &#039;&#039;куча&#039;&#039;. Для каждого кластера math&amp;gt;i&amp;lt;/math&amp;gt; хранится своя куча &amp;lt;math&amp;gt;q[i]&amp;lt;/math&amp;gt;, содержащая все связанный с ним кластеры, упорядоченная по убыванию функции качества. Также хранится глобальная куча &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, содержащая все кластеры &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, упорядоченные по мере убывания функции качества &amp;lt;math&amp;gt;g(j, max(q[j]))&amp;lt;/math&amp;gt;. На каждом шаге итерации, после объединения кластеров требуется перестроить кучи объединённых кластеров в одну и перестроить глобальную кучу.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Divanov</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=11208</id>
		<title>Участник:Иванов Даниил/Алгоритм устойчивой кластеризации с иcпользованием связей</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=11208"/>
		<updated>2016-10-15T18:53:40Z</updated>

		<summary type="html">&lt;p&gt;Divanov: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Вступление&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
:Алгоритм устойчивой кластеризации с иcпользованием связей (&#039;&#039;&#039;robust clustering using links&#039;&#039;&#039;, &#039;&#039;ROCK&#039;&#039;) решает задачу [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F кластеризации] объектов по заранее заданному количеству &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. В пространстве объектов должна быть определена функция сходства/расстояния между объекта &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;. Данный алгоритм относится к иерархическим методам кластеризации, который начинает с разбиения пространства на большое количество кластеров и постепенно объединяя их до нужного количества. Алгоритм пытается объединить в один кластер точки с максимальным числом общих соседей.&lt;br /&gt;
&lt;br /&gt;
:Данный алгоритм хорошо подходит для объектов с категориальными признаками (то есть признаками, принимающими небольшое количество значений). С помощью этого алгоритма также часто решается задача [https://en.wikipedia.org/wiki/Association_rule_learning поиска ассоциативных правил].&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
:Пусть дано множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;, натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;, пороговое значение &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt; и функция функция &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
:Результатом работы алгоритма является &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; непересекающихся кластеров, делящих множество &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Две точки называются &#039;&#039;соседними&#039;&#039;, если &amp;lt;math&amp;gt;sim(p_i, p_j) \geq \theta&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Количеством общих соседей &amp;lt;math&amp;gt;link(p_i, p_j)&amp;lt;/math&amp;gt; называется число точек, являющимися соседними для точек &amp;lt;math&amp;gt;p_i, p_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией связи между кластерами называется &amp;lt;math&amp;gt;link[C_i, C_j] = \sum_{\begin{smallmatrix}p_q\in C_i,\; p_r\in C_j\end{smallmatrix}}^{ } link(p_{q},p_r)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией качества является функция&lt;br /&gt;
:&amp;lt;math&amp;gt; g(C_i, C_j) = \frac{link[C_i,C_j]}{(n_i + n_j)^{1 + 2f(\theta )} - n_i^{1+2f(\theta )} - n_j^{1+2f(\theta )}}&amp;lt;/math&amp;gt;,  где &amp;lt;math&amp;gt;n_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;n&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
:Затем на каждом шаге он вычисляет значение &amp;lt;math&amp;gt;g(C_i, C_j)&amp;lt;/math&amp;gt; для каждой пары кластеров и объединяет эти кластеры в один.&lt;br /&gt;
:Алгоритм ведёт свою работу до тех пор, пока не получит &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:В качестве функции &amp;lt;math&amp;gt;f( \theta )&amp;lt;/math&amp;gt; обычно используется функция &amp;lt;math&amp;gt;f(\theta ) = \frac{\theta - 1}{\theta + 1}&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;n_i^{1+2f(\theta )}&amp;lt;/math&amp;gt; - ожидаемое число связей между парами объектов кластера &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Если все признаки категориальны, то в качестве функции схожести можно использовать функцию:&lt;br /&gt;
:&amp;lt;math&amp;gt;sim(p_i,p_j) = \frac{|p_i\cap p_j|}{|p_i\cup p_j|}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|p_i|&amp;lt;/math&amp;gt; - количество атрибутов в &amp;lt;math&amp;gt;p_i&amp;lt;/math&amp;gt;. Данная функция удобна в случае, если все признаки категориальны&lt;br /&gt;
:Если же признаки непрерывны, то можно использовать функции расстояний в многомерных пространствах, предварительно нормализовав признаки.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Divanov</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=11176</id>
		<title>Участник:Иванов Даниил/Алгоритм устойчивой кластеризации с иcпользованием связей</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=11176"/>
		<updated>2016-10-15T18:44:50Z</updated>

		<summary type="html">&lt;p&gt;Divanov: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Вступление&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
:Алгоритм устойчивой кластеризации с иcпользованием связей (&#039;&#039;&#039;robust clustering using links&#039;&#039;&#039;, &#039;&#039;ROCK&#039;&#039;) решает задачу [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F кластеризации] объектов по заранее заданному количеству &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. В пространстве объектов должна быть определена функция сходства/расстояния между объекта &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;. Данный алгоритм относится к иерархическим методам кластеризации, который начинает с разбиения пространства на большое количество кластеров и постепенно объединяя их до нужного количества. Алгоритм пытается объединить в один кластер точки с максимальным числом общих соседей.&lt;br /&gt;
&lt;br /&gt;
:Данный алгоритм хорошо подходит для объектов с категориальными признаками (то есть признаками, принимающими небольшое количество значений). С помощью этого алгоритма также часто решается задача [https://en.wikipedia.org/wiki/Association_rule_learning поиска ассоциативных правил].&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
:Пусть дано множество объектов &amp;lt;math&amp;gt;P = \{p_1, \ldots , p_n\}&amp;lt;/math&amp;gt;, натуральное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, функция схожести &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;, пороговое значение &amp;lt;math&amp;gt;\theta : 0\leq\theta\leq 1&amp;lt;/math&amp;gt; и функция функция &amp;lt;math&amp;gt; f( \theta ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
:Результатом работы алгоритма является &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; непересекающихся кластеров, делящих множество &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Две точки называются &#039;&#039;соседними&#039;&#039;, если &amp;lt;math&amp;gt;sim(p_i, p_j) \geq \theta&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Количеством общих соседей &amp;lt;math&amp;gt;link(p_i, p_j)&amp;lt;/math&amp;gt; называется число точек, являющимися соседними для точек &amp;lt;math&amp;gt;p_i, p_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией связи между кластерами называется &amp;lt;math&amp;gt;link[C_i, C_j] = \sum_{\begin{smallmatrix}p_q\in C_i,\; p_r\in C_j\end{smallmatrix}}^{ } link(p_{q},p_r)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Функцией качества является функция&lt;br /&gt;
:&amp;lt;math&amp;gt; g(C_i, C_j) = \frac{link[C_i,C_j]}{(n_i + n_j)^{1 + 2f(\theta )} - n_i^{1+2f(\theta )} - n_j^{1+2f(\theta )}}&amp;lt;/math&amp;gt;,  где &amp;lt;math&amp;gt;n_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;n&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
:Затем на каждом шаге он вычисляет значение &amp;lt;math&amp;gt;g(C_i, C_j)&amp;lt;/math&amp;gt; для каждой пары кластеров и объединяет эти кластеры в один.&lt;br /&gt;
:Алгоритм ведёт свою работу до тех пор, пока не получит &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Divanov</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=11080</id>
		<title>Участник:Иванов Даниил/Алгоритм устойчивой кластеризации с иcпользованием связей</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=11080"/>
		<updated>2016-10-15T18:21:47Z</updated>

		<summary type="html">&lt;p&gt;Divanov: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Вступление&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
:Алгоритм устойчивой кластеризации с иcпользованием связей (&#039;&#039;&#039;robust clustering using links&#039;&#039;&#039;, &#039;&#039;ROCK&#039;&#039;) решает задачу [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F кластеризации] объектов по заранее заданному количеству &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. В пространстве объектов должна быть определена функция сходства/расстояния между объекта &amp;lt;math&amp;gt;sim(p_i, p_j)&amp;lt;/math&amp;gt;. Данный алгоритм относится к иерархическим методам кластеризации, который начинает с разбиения пространства на большое количество кластеров и постепенно объединяя их до нужного количества. Алгоритм пытается объединить в один кластер точки с максимальным числом общих соседей.&lt;br /&gt;
&lt;br /&gt;
:Данный алгоритм хорошо подходит для объектов с категориальными признаками (то есть признаками, принимающими небольшое количество значений). С помощью этого алгоритма также часто решается задача [https://en.wikipedia.org/wiki/Association_rule_learning поиска ассоциативных правил].&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Divanov</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=10720</id>
		<title>Участник:Иванов Даниил/Алгоритм устойчивой кластеризации с иcпользованием связей</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%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D0%B8%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81_%D0%B8c%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9&amp;diff=10720"/>
		<updated>2016-10-15T17:09:17Z</updated>

		<summary type="html">&lt;p&gt;Divanov: Новая страница: «Вступление  = ЧАСТЬ. Свойства и структура алгоритмов =   == Общее описание алгоритма ==  == Ма…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Вступление&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Divanov</name></author>
	</entry>
</feed>