<?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=Viktorrulev</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=Viktorrulev"/>
	<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/Viktorrulev"/>
	<updated>2026-10-22T17:17:35Z</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:Viktorrulev/%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=21027</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=21027"/>
		<updated>2016-12-16T09:40:56Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Teplov}}&lt;br /&gt;
&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
&lt;br /&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо конечного множества), бинарными (принимающими только два значения, обычно &amp;lt;math&amp;gt;true&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;false&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с бинарными признаками. При этом алгоритм особенно эффективен, если у каждого объекта лишь небольшое количество признаков имеет значение &amp;lt;math&amp;gt;true&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся объектов &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть два объекта &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства &amp;lt;math&amp;gt;neighbour(p_1,p_2)&amp;lt;/math&amp;gt; этих объектов больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства &amp;lt;math&amp;gt;sim(p_1,p_2)&amp;lt;/math&amp;gt;. В ней &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; &amp;lt;math&amp;gt;link(p_1,p_2)&amp;lt;/math&amp;gt; между двумя объектами &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; будем называть количество общих соседей этих объектов.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика &amp;lt;math&amp;gt;goodness(C_i,C_j)&amp;lt;/math&amp;gt; достигает максимального значения среди всех пар кластеров. На начальном этапе каждый объект считается отдельным кластером.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
f(\theta)=\frac {1-\theta}{1+\theta}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\theta)}}&lt;br /&gt;
&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;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми объектами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждого объекта значительно меньше общего количества объектов, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма в общем случае можно оценить, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
или в случае небольшого количества соседних объектов для каждого объекта выборки, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Информационный граф перемножения плотных матриц с подробным описанием представлен в статье [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ниже представлен информационный граф наиболее интересного для рассмотрения этапа алгоритма устойчивой кластеризации с использованием связей - тела цикла (полупрозрачным показана следующая итерация цикла) при &amp;lt;math&amp;gt;n=5&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:rock-graph.png|thumb|center|1000px|Рисунок 1. Граф тела цикла; merge - объединение кластеров, insert - вставка goodness с новым кластером в упорядоченные списки соответствующих кластеров.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; при использовании алгоритма наивного перемножения плотных матриц высота ЯПФ равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, а внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга. Следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а высота ЯПФ равна &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи как &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, а ширина ЯПФ - как &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; объектах, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов объекта имеет значение &amp;quot;true&amp;quot;, каждый объект можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;true&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; индексов объектов, распределенных в &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; списков.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность последовательного алгоритма в общем случае равна &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt;, а в случае небольшого количества соседних объектов у каждого объекта сложность равна &amp;lt;math&amp;gt;O(M^{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (соотношение количества операций к объему входных и выходных данных) в общем случае равна O(M^{1.37}), в а случае небольшого количества соседних объектов (то есть в том случае, для которого и разрабатывался алгоритм) вычислительная мощность линейна.&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как показано выше, является квадратичным.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации алгоритма устройчивой кластеризации с использованием связей, выполненной с использованием OpenMP. Исследование проводилось на персональном компьютере HP Pavilion dv6 (процессор Intel Core i7 3610QM 2300 МГц, 8 логических ядер).&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число нитей [1 : 8] с шагом 1;&lt;br /&gt;
*	количество точек [500 : 1500] с шагом 100.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики времени выполнения выбранной реализации алгоритма устойчивой кластеризации с использованием связей в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:ROCK results 2.png|thumb|center|700px|Рисунок 2. Параллельная реализация алгоритма устойчивой кластеризации с использованием связей. Изменение времени выполнения кластеризации в зависимости от количества точек и от количества параллельных нитей.]]&lt;br /&gt;
&lt;br /&gt;
Время выполнения кластеризации:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |&lt;br /&gt;
 | 500 объектов &lt;br /&gt;
 | 1000 объектов &lt;br /&gt;
 | 1500 объектов &lt;br /&gt;
 |-&lt;br /&gt;
 | 1 нить&lt;br /&gt;
 | 7.930 с &lt;br /&gt;
 | 63.308 с &lt;br /&gt;
 | 214.692 с &lt;br /&gt;
 |-&lt;br /&gt;
 | 4 нити &lt;br /&gt;
 | 4.815 с &lt;br /&gt;
 | 37.275 с &lt;br /&gt;
 | 126.502 с &lt;br /&gt;
 |-&lt;br /&gt;
 | 8 нитей &lt;br /&gt;
 | 5.312 с &lt;br /&gt;
 | 39.986 с &lt;br /&gt;
 | 135.251 с &lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма была выполнена автором статьи.&amp;lt;ref&amp;gt;https://gitlab.com/viktorrulev/superprak-1/tree/master&amp;lt;/ref&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;
Алгоритм устойчивой кластеризации с иcпользованием связей реализован в пакете 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;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=21026</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=21026"/>
		<updated>2016-12-16T09:40:20Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Teplov}}&lt;br /&gt;
&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
&lt;br /&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо конечного множества), бинарными (принимающими только два значения, обычно &amp;lt;math&amp;gt;true&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;false&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с бинарными признаками. При этом алгоритм особенно эффективен, если у каждого объекта лишь небольшое количество признаков имеет значение &amp;lt;math&amp;gt;true&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся объектов &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть два объекта &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства &amp;lt;math&amp;gt;neighbour(p_1,p_2)&amp;lt;/math&amp;gt; этих объектов больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства &amp;lt;math&amp;gt;sim(p_1,p_2)&amp;lt;/math&amp;gt;. В ней &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; &amp;lt;math&amp;gt;link(p_1,p_2)&amp;lt;/math&amp;gt; между двумя объектами &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; будем называть количество общих соседей этих объектов.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика &amp;lt;math&amp;gt;goodness(C_i,C_j)&amp;lt;/math&amp;gt; достигает максимального значения среди всех пар кластеров. На начальном этапе каждый объект считается отдельным кластером.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
f(\theta)=\frac {1-\theta}{1+\theta}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\theta)}}&lt;br /&gt;
&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;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми объектами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждого объекта значительно меньше общего количества объектов, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма в общем случае можно оценить, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
или в случае небольшого количества соседних объектов для каждого объекта выборки, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Информационный граф перемножения плотных матриц с подробным описанием представлен в статье [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ниже представлен информационный граф наиболее интересного для рассмотрения этапа алгоритма устойчивой кластеризации с использованием связей - тела цикла (полупрозрачным показана следующая итерация цикла) при &amp;lt;math&amp;gt;n=5&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:rock-graph.png|thumb|center|1000px|Рисунок 1. Граф тела цикла; merge - объединение кластеров, insert - вставка goodness с новым кластером в упорядоченные списки соответствующих кластеров.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; при использовании алгоритма наивного перемножения плотных матриц высота ЯПФ равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, а внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга. Следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а высота ЯПФ равна &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи как &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, а ширина ЯПФ - как &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; объектах, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов объекта имеет значение &amp;quot;true&amp;quot;, каждый объект можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;true&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; индексов объектов, распределенных в &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; списков.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность последовательного алгоритма в общем случае равна &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt;, а в случае небольшого количества соседних объектов у каждого объекта сложность равна &amp;lt;math&amp;gt;O(M^{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (соотношение количества операций к объему входных и выходных данных) в общем случае равна O(M^{1.37}), в а случае небольшого количества соседних объектов (то есть в том случае, для которого и разрабатывался алгоритм) вычислительная мощность линейна.&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как показано выше, является квадратичным.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации алгоритма устройчивой кластеризации с использованием связей, выполненной с использованием OpenMP. Исследование проводилось на персональном компьютере HP Pavilion dv6 (процессор Intel Core i7 3610QM 2300 МГц, 8 логических ядер).&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число нитей [1 : 8] с шагом 1;&lt;br /&gt;
*	количество точек [500 : 1500] с шагом 100.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики времени выполнения выбранной реализации алгоритма устойчивой кластеризации с использованием связей в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:ROCK results 2.png|thumb|center|700px|Рисунок 2. Параллельная реализация алгоритма устойчивой кластеризации с использованием связей. Изменение времени выполнения кластеризации в зависимости от количества точек и от количества параллельных нитей.]]&lt;br /&gt;
&lt;br /&gt;
Таблица с временем выполнения кластеризации:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |&lt;br /&gt;
 | 500 объектов &lt;br /&gt;
 | 1000 объектов &lt;br /&gt;
 | 1500 объектов &lt;br /&gt;
 |-&lt;br /&gt;
 | 1 нить&lt;br /&gt;
 | 7.930 с &lt;br /&gt;
 | 63.308 с &lt;br /&gt;
 | 214.692 с &lt;br /&gt;
 |-&lt;br /&gt;
 | 4 нити &lt;br /&gt;
 | 4.815 с &lt;br /&gt;
 | 37.275 с &lt;br /&gt;
 | 126.502 с &lt;br /&gt;
 |-&lt;br /&gt;
 | 8 нитей &lt;br /&gt;
 | 5.312 с &lt;br /&gt;
 | 39.986 с &lt;br /&gt;
 | 135.251 с &lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма была выполнена автором статьи.&amp;lt;ref&amp;gt;https://gitlab.com/viktorrulev/superprak-1/tree/master&amp;lt;/ref&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;
Алгоритм устойчивой кластеризации с иcпользованием связей реализован в пакете 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;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Viktorrulev&amp;diff=21025</id>
		<title>Обсуждение участника:Viktorrulev</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Viktorrulev&amp;diff=21025"/>
		<updated>2016-12-16T09:29:24Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: /* Замечания от 2016_12_11 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:Viktorrulev/Алгоритм устойчивой кластеризации с иcпользованием связей]] ==&lt;br /&gt;
&lt;br /&gt;
=== Замечания ===&lt;br /&gt;
* Формулы нужно оформить в отдельные блоки для лучшей читаемости [[Участник:Teplov|Teplov]] ([[Обсуждение участника:Teplov|обсуждение]]) 01:13, 23 октября 2016 (MSK)&lt;br /&gt;
:: Исправлено (сделать все формулы в одном блоке и выровнять по левой стороне вики не позволяет) [[Участник:Viktorrulev|Viktorrulev]] ([[Обсуждение участника:Viktorrulev|обсуждение]]) 12:18, 26 октября 2016 (MSK)&lt;br /&gt;
* В п. 2.7 необходимо указать ссылку на источник [[Участник:Teplov|Teplov]] ([[Обсуждение участника:Teplov|обсуждение]]) 01:13, 23 октября 2016 (MSK)&lt;br /&gt;
:: Исправлено [[Участник:Viktorrulev|Viktorrulev]] ([[Обсуждение участника:Viktorrulev|обсуждение]]) 12:18, 26 октября 2016 (MSK)&lt;br /&gt;
* В п. 1.5 указать на каком языке представлена реализация [[Участник:Teplov|Teplov]] ([[Обсуждение участника:Teplov|обсуждение]]) 01:13, 23 октября 2016 (MSK)&lt;br /&gt;
:: Исправлено [[Участник:Viktorrulev|Viktorrulev]] ([[Обсуждение участника:Viktorrulev|обсуждение]]) 12:18, 26 октября 2016 (MSK)&lt;br /&gt;
* В п. в п. 1.7  не указано для каких параметров построен граф. [[Участник:Teplov|Teplov]] ([[Обсуждение участника:Teplov|обсуждение]]) 01:13, 23 октября 2016 (MSK)&lt;br /&gt;
:: Исправлено [[Участник:Viktorrulev|Viktorrulev]] ([[Обсуждение участника:Viktorrulev|обсуждение]]) 12:18, 26 октября 2016 (MSK)&lt;br /&gt;
* Нужно более полное описание вычислительной мощности алгоритма [[Участник:Teplov|Teplov]] ([[Обсуждение участника:Teplov|обсуждение]]) 01:13, 23 октября 2016 (MSK)&lt;br /&gt;
:: Дополнено [[Участник:Viktorrulev|Viktorrulev]] ([[Обсуждение участника:Viktorrulev|обсуждение]]) 12:18, 26 октября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
* Отсутствуют данные по численному эксперименту и масштабируемости. [[Участник:Teplov|Teplov]] ([[Обсуждение участника:Teplov|обсуждение]]) 15:01, 22 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
== Замечания от 2016_12_11 1 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Разделы 1.1, 1.2, 1.3 описывают конкретную область (покупательная корзина и прочее), не имеющую никакого значения с точки зрения математической постановки задачи. Использование термина &amp;quot;транзакция&amp;quot; неоправданно затрудняет восприятие текста. Появляется много терминов, некоторые из к4оторых в контексте суперкомпьютерных технологий имеют совершенно иной, нежели в &#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;
:: Я придерживался терминологии статьи. Переделал, теперь вроде бы используются только общепринятые термины. [[Участник:Viktorrulev|Viktorrulev]] ([[Обсуждение участника:Viktorrulev|обсуждение]]) 12:29, 16 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
Есть граф, вершины, метрика и взвешенные рёбра. Почему нельзя ограничиться этой общепринятой терминологией? &lt;br /&gt;
&lt;br /&gt;
:: Эта статья о кластеризации точек в пространстве, графы в описании алгоритма из статьи ни разу не упоминаются. Не вижу смысла писать о них в этой статье. [[Участник:Viktorrulev|Viktorrulev]] ([[Обсуждение участника:Viktorrulev|обсуждение]]) 12:29, 16 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
Стоит ли заставлять читателя запоминать термин &amp;quot;домен признака&amp;quot;, хотя по существу в статье он не используется?&lt;br /&gt;
&lt;br /&gt;
Дополните статью таблицей (хотя бы для двух-трёх размеров графа, например, M=500,1000,1500) с графами: число потоков, время выполнения, ускорение, эффективность.&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, в тексте нет понятия points, а на графике есть. Используйте одну систему обозначений.&lt;br /&gt;
&lt;br /&gt;
:: Заменил. [[Участник:Viktorrulev|Viktorrulev]] ([[Обсуждение участника:Viktorrulev|обсуждение]]) 12:29, 16 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
 Раздел 1.6 &lt;br /&gt;
Замените текст &amp;quot;имеет такую же вычислительную сложность, как и предыдущий шаг. &amp;quot;&lt;br /&gt;
на &amp;quot;имеет сложность O(M). &amp;quot;. Не заставляйте читателя метаться по тексту, ему и так непросто.&lt;br /&gt;
&lt;br /&gt;
:: Исправил. [[Участник:Viktorrulev|Viktorrulev]] ([[Обсуждение участника:Viktorrulev|обсуждение]]) 12:29, 16 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
 Раздел 1.7 &lt;br /&gt;
Оценка сложности перемножения матриц в Вашей статье то &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;,&lt;br /&gt;
что вполне можно понять, но ссылку на информационный граф перемножения плотных матриц указана на совершенно другой алгоритм, с оценкой &amp;lt;math&amp;gt;O(M^{3})&amp;lt;/math&amp;gt;. Определитесь, пожалуйста.&lt;br /&gt;
&lt;br /&gt;
:: Я указал ссылку на статью в алговики, в которой рассказываются общие вещи о перемножении плотных матриц. При рассмотрении ресурса параллелизма я рассмотрел наивное перемножение матриц, потому что на общую асимптотику оно не влияет, а найти высоту и ширину ЯПФ более сложных и быстрых алгоритмов у меня не получилось. На два других алгоритма ссылалась статья, и я решил о них упомянуть. Уточнил в статье, чтобы у читателя не возникало сомнений. [[Участник:Viktorrulev|Viktorrulev]] ([[Обсуждение участника:Viktorrulev|обсуждение]]) 12:29, 16 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
Если я правильно понял, Вы самостоятельно написали программы. Укажите это явно в разделе 2.4. &lt;br /&gt;
&lt;br /&gt;
:: Да. Указал это, дал ссылку на репозиторий на гитлабе. [[Участник:Viktorrulev|Viktorrulev]] ([[Обсуждение участника:Viktorrulev|обсуждение]]) 12:29, 16 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
Есть ли соображения, в чём причина отсутствия ускорения на Ломоносове? Какие там времена получились?&lt;br /&gt;
&lt;br /&gt;
--[[Участник:Lira|Lira]] ([[Обсуждение участника:Lira|обсуждение]]) 23:42, 11 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
:: Возможно потому, что я как-то неправильно собираю и запускаю проект, или неправильно измеряю время. Но скорее всего из-за того, что в реализации на MPI после каждой итерации каждый процесс несколько раз обменивается с каждым (два allgather) достаточно большими объемами информации. Придумать, как это сделать в помощью одного allreduce, у меня не получилось, хотя, возможно, это ускорило бы обмен. OpenMP-реализации на Ломоносове, как я понял, в принципе не очень эффективны (возможно, получилось бы быстрее, если бы OpenMP на Ломоносове поддерживал пользовательские reduce-операции). Результаты OpenMP:&lt;br /&gt;
&lt;br /&gt;
::Threads: 1, time: 0.15 0.85 2.46 5.54 10.48 17.81 27.94 41.44 58.63 80.34&lt;br /&gt;
&lt;br /&gt;
::Threads: 8, time: 0.2 0.87 2.43 5.43 10.31 17.51 27.18 40.42 57.33 78.81&lt;br /&gt;
&lt;br /&gt;
::Threads: 16, time: 11.68 25.73 40.48 57.13 75.34 94.83 118.98 139.17 173.92 210.98&lt;br /&gt;
&lt;br /&gt;
::Threads: 24, time: 18.95 39.87 61.52 85.27 110.02 136.77 167.49 201.79 237.88 283.29&lt;br /&gt;
&lt;br /&gt;
::Результаты MPI-реализации не могу найти, но, если надо, могу получить. Насколько я помню, в них в зависимости от количества процессов время выполнения стабильно росло. [[Участник:Viktorrulev|Viktorrulev]] ([[Обсуждение участника:Viktorrulev|обсуждение]]) 12:29, 16 декабря 2016 (MSK)&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=21024</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=21024"/>
		<updated>2016-12-16T09:22:01Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Teplov}}&lt;br /&gt;
&lt;br /&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо конечного множества), бинарными (принимающими только два значения, обычно &amp;lt;math&amp;gt;true&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;false&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с бинарными признаками. При этом алгоритм особенно эффективен, если у каждого объекта лишь небольшое количество признаков имеет значение &amp;lt;math&amp;gt;true&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся объектов &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть два объекта &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства &amp;lt;math&amp;gt;neighbour(p_1,p_2)&amp;lt;/math&amp;gt; этих объектов больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства &amp;lt;math&amp;gt;sim(p_1,p_2)&amp;lt;/math&amp;gt;. В ней &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; &amp;lt;math&amp;gt;link(p_1,p_2)&amp;lt;/math&amp;gt; между двумя объектами &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; будем называть количество общих соседей этих объектов.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика &amp;lt;math&amp;gt;goodness(C_i,C_j)&amp;lt;/math&amp;gt; достигает максимального значения среди всех пар кластеров. На начальном этапе каждый объект считается отдельным кластером.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
f(\theta)=\frac {1-\theta}{1+\theta}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\theta)}}&lt;br /&gt;
&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;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми объектами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждого объекта значительно меньше общего количества объектов, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма в общем случае можно оценить, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
или в случае небольшого количества соседних объектов для каждого объекта выборки, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Информационный граф перемножения плотных матриц с подробным описанием представлен в статье [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ниже представлен информационный граф наиболее интересного для рассмотрения этапа алгоритма устойчивой кластеризации с использованием связей - тела цикла (полупрозрачным показана следующая итерация цикла) при &amp;lt;math&amp;gt;n=5&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:rock-graph.png|thumb|center|1000px|Рисунок 1. Граф тела цикла; merge - объединение кластеров, insert - вставка goodness с новым кластером в упорядоченные списки соответствующих кластеров.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; при использовании алгоритма наивного перемножения плотных матриц высота ЯПФ равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, а внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга. Следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а высота ЯПФ равна &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи как &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, а ширина ЯПФ - как &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; объектах, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов объекта имеет значение &amp;quot;true&amp;quot;, каждый объект можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;true&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; индексов объектов, распределенных в &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; списков.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность последовательного алгоритма в общем случае равна &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt;, а в случае небольшого количества соседних объектов у каждого объекта сложность равна &amp;lt;math&amp;gt;O(M^{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (соотношение количества операций к объему входных и выходных данных) в общем случае равна O(M^{1.37}), в а случае небольшого количества соседних объектов (то есть в том случае, для которого и разрабатывался алгоритм) вычислительная мощность линейна.&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как показано выше, является квадратичным.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации алгоритма устройчивой кластеризации с использованием связей, выполненной с использованием OpenMP. Исследование проводилось на персональном компьютере HP Pavilion dv6 (процессор Intel Core i7 3610QM 2300 МГц, 8 логических ядер).&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число нитей [1 : 8] с шагом 1;&lt;br /&gt;
*	количество точек [500 : 1500] с шагом 100.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики времени выполнения выбранной реализации алгоритма устойчивой кластеризации с использованием связей в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:ROCK results 2.png|thumb|center|700px|Рисунок 2. Параллельная реализация алгоритма устойчивой кластеризации с использованием связей. Изменение времени выполнения кластеризации в зависимости от количества точек и от количества параллельных нитей.]]&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма была выполнена автором статьи.&amp;lt;ref&amp;gt;https://gitlab.com/viktorrulev/superprak-1/tree/master&amp;lt;/ref&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;
Алгоритм устойчивой кластеризации с иcпользованием связей реализован в пакете 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;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=21023</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=21023"/>
		<updated>2016-12-16T09:19:16Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Teplov}}&lt;br /&gt;
&lt;br /&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо конечного множества), бинарными (принимающими только два значения, обычно &amp;lt;math&amp;gt;true&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;false&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с бинарными признаками. При этом алгоритм особенно эффективен, если у каждого объекта лишь небольшое количество признаков имеет значение &amp;lt;math&amp;gt;true&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся объектов &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть два объекта &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства &amp;lt;math&amp;gt;neighbour(p_1,p_2)&amp;lt;/math&amp;gt; этих объектов больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства &amp;lt;math&amp;gt;sim(p_1,p_2)&amp;lt;/math&amp;gt;. В ней &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; &amp;lt;math&amp;gt;link(p_1,p_2)&amp;lt;/math&amp;gt; между двумя объектами &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; будем называть количество общих соседей этих объектов.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика &amp;lt;math&amp;gt;goodness(C_i,C_j)&amp;lt;/math&amp;gt; достигает максимального значения среди всех пар кластеров. На начальном этапе каждый объект считается отдельным кластером.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
f(\theta)=\frac {1-\theta}{1+\theta}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\theta)}}&lt;br /&gt;
&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;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми объектами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждого объекта значительно меньше общего количества объектов, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма в общем случае можно оценить, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
или в случае небольшого количества соседних объектов для каждого объекта выборки, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Информационный граф перемножения плотных матриц с подробным описанием представлен в статье [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ниже представлен информационный граф наиболее интересного для рассмотрения этапа алгоритма устойчивой кластеризации с использованием связей - тела цикла (полупрозрачным показана следующая итерация цикла) при &amp;lt;math&amp;gt;n=5&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:rock-graph.png|thumb|center|1000px|Рисунок 1. Граф тела цикла; merge - объединение кластеров, insert - вставка goodness с новым кластером в упорядоченные списки соответствующих кластеров.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; при использовании алгоритма наивного перемножения плотных матриц высота ЯПФ равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, а внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга. Следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а высота ЯПФ равна &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи как &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, а ширина ЯПФ - как &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; объектах, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов объекта имеет значение &amp;quot;true&amp;quot;, каждый объект можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;true&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; индексов объектов, распределенных в &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; списков.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность последовательного алгоритма в общем случае равна &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt;, а в случае небольшого количества соседних объектов у каждого объекта сложность равна &amp;lt;math&amp;gt;O(M^{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (соотношение количества операций к объему входных и выходных данных) в общем случае равна O(M^{1.37}), в а случае небольшого количества соседних объектов (то есть в том случае, для которого и разрабатывался алгоритм) вычислительная мощность линейна.&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как показано выше, является квадратичным.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации алгоритма устройчивой кластеризации с использованием связей, выполненной с использованием OpenMP. Исследование проводилось на персональном компьютере HP Pavilion dv6 (процессор Intel Core i7 3610QM 2300 МГц, 8 логических ядер).&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число нитей [1 : 8] с шагом 1;&lt;br /&gt;
*	количество точек [500 : 1500] с шагом 100.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики времени выполнения выбранной реализации алгоритма устойчивой кластеризации с использованием связей в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:ROCK results 2.png|thumb|center|700px|Рисунок 2. Параллельная реализация алгоритма устойчивой кластеризации с использованием связей. Изменение времени выполнения кластеризации в зависимости от количества точек и от количества параллельных нитей.]]&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма была выполнена автором статьи.&amp;lt;ref&amp;gt;https://gitlab.com/viktorrulev/superprak-1/tree/master&amp;lt;/ref&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;
Алгоритм устойчивой кластеризации с иcпользованием связей реализован в пакете 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;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=21022</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=21022"/>
		<updated>2016-12-16T09:16:51Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Teplov}}&lt;br /&gt;
&lt;br /&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо конечного множества), бинарными (принимающими только два значения, обычно &amp;lt;math&amp;gt;true&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;false&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с бинарными признаками. При этом алгоритм особенно эффективен, если у каждого объекта лишь небольшое количество признаков имеет значение &amp;lt;math&amp;gt;true&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся объектов &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть два объекта &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства &amp;lt;math&amp;gt;neighbour(p_1,p_2)&amp;lt;/math&amp;gt; этих объектов больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства &amp;lt;math&amp;gt;sim(p_1,p_2)&amp;lt;/math&amp;gt;. В ней &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; &amp;lt;math&amp;gt;link(p_1,p_2)&amp;lt;/math&amp;gt; между двумя объектами &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; будем называть количество общих соседей этих объектов.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика &amp;lt;math&amp;gt;goodness(C_i,C_j)&amp;lt;/math&amp;gt; достигает максимального значения среди всех пар кластеров. На начальном этапе каждый объект считается отдельным кластером.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
f(\theta)=\frac {1-\theta}{1+\theta}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\theta)}}&lt;br /&gt;
&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;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми объектами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждого объекта значительно меньше общего количества объектов, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма в общем случае можно оценить, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
или в случае небольшого количества соседних объектов для каждого объекта выборки, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Информационный граф перемножения плотных матриц с подробным описанием представлен в статье [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ниже представлен информационный граф наиболее интересного для рассмотрения этапа алгоритма устойчивой кластеризации с использованием связей - тела цикла (полупрозрачным показана следующая итерация цикла) при &amp;lt;math&amp;gt;n=5&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:rock-graph.png|thumb|center|1000px|Рисунок 1. Граф тела цикла; merge - объединение кластеров, insert - вставка goodness с новым кластером в упорядоченные списки соответствующих кластеров.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; высота ЯПФ равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, а внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга. Следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а высота ЯПФ равна &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи как &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, а ширина ЯПФ - как &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; объектах, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов объекта имеет значение &amp;quot;true&amp;quot;, каждый объект можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;true&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; индексов объектов, распределенных в &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; списков.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность последовательного алгоритма в общем случае равна &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt;, а в случае небольшого количества соседних объектов у каждого объекта сложность равна &amp;lt;math&amp;gt;O(M^{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (соотношение количества операций к объему входных и выходных данных) в общем случае равна O(M^{1.37}), в а случае небольшого количества соседних объектов (то есть в том случае, для которого и разрабатывался алгоритм) вычислительная мощность линейна.&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как показано выше, является квадратичным.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации алгоритма устройчивой кластеризации с использованием связей, выполненной с использованием OpenMP. Исследование проводилось на персональном компьютере HP Pavilion dv6 (процессор Intel Core i7 3610QM 2300 МГц, 8 логических ядер).&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число нитей [1 : 8] с шагом 1;&lt;br /&gt;
*	количество точек [500 : 1500] с шагом 100.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики времени выполнения выбранной реализации алгоритма устойчивой кластеризации с использованием связей в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:ROCK results 2.png|thumb|center|700px|Рисунок 2. Параллельная реализация алгоритма устойчивой кластеризации с использованием связей. Изменение времени выполнения кластеризации в зависимости от количества точек и от количества параллельных нитей.]]&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма была выполнена автором статьи.&amp;lt;ref&amp;gt;https://gitlab.com/viktorrulev/superprak-1/tree/master&amp;lt;/ref&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;
Алгоритм устойчивой кластеризации с иcпользованием связей реализован в пакете 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;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=21021</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=21021"/>
		<updated>2016-12-16T09:16:34Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: /* Программная реализация алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Teplov}}&lt;br /&gt;
&lt;br /&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо конечного множества), бинарными (принимающими только два значения, обычно &amp;lt;math&amp;gt;true&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;false&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с бинарными признаками. При этом алгоритм особенно эффективен, если у каждого объекта лишь небольшое количество признаков имеет значение &amp;lt;math&amp;gt;true&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся объектов &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть два объекта &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства &amp;lt;math&amp;gt;neighbour(p_1,p_2)&amp;lt;/math&amp;gt; этих объектов больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства &amp;lt;math&amp;gt;sim(p_1,p_2)&amp;lt;/math&amp;gt;. В ней &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; &amp;lt;math&amp;gt;link(p_1,p_2)&amp;lt;/math&amp;gt; между двумя объектами &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; будем называть количество общих соседей этих объектов.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика &amp;lt;math&amp;gt;goodness(C_i,C_j)&amp;lt;/math&amp;gt; достигает максимального значения среди всех пар кластеров. На начальном этапе каждый объект считается отдельным кластером.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
f(\theta)=\frac {1-\theta}{1+\theta}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\theta)}}&lt;br /&gt;
&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;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми объектами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждого объекта значительно меньше общего количества объектов, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма в общем случае можно оценить, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
или в случае небольшого количества соседних объектов для каждого объекта выборки, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Информационный граф перемножения плотных матриц с подробным описанием представлен в статье [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ниже представлен информационный граф наиболее интересного для рассмотрения этапа алгоритма устойчивой кластеризации с использованием связей - тела цикла (полупрозрачным показана следующая итерация цикла) при &amp;lt;math&amp;gt;n=5&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:rock-graph.png|thumb|center|1000px|Рисунок 1. Граф тела цикла; merge - объединение кластеров, insert - вставка goodness с новым кластером в упорядоченные списки соответствующих кластеров.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; высота ЯПФ равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, а внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга. Следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а высота ЯПФ равна &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи как &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, а ширина ЯПФ - как &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; объектах, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов объекта имеет значение &amp;quot;true&amp;quot;, каждый объект можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;true&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; индексов объектов, распределенных в &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; списков.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность последовательного алгоритма в общем случае равна &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt;, а в случае небольшого количества соседних объектов у каждого объекта сложность равна &amp;lt;math&amp;gt;O(M^{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (соотношение количества операций к объему входных и выходных данных) в общем случае равна O(M^{1.37}), в а случае небольшого количества соседних объектов (то есть в том случае, для которого и разрабатывался алгоритм) вычислительная мощность линейна.&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как показано выше, является квадратичным.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации алгоритма устройчивой кластеризации с использованием связей, выполненной с использованием OpenMP. Исследование проводилось на персональном компьютере HP Pavilion dv6 (процессор Intel Core i7 3610QM 2300 МГц, 8 логических ядер).&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число нитей [1 : 8] с шагом 1;&lt;br /&gt;
*	количество точек [500 : 1500] с шагом 100.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики времени выполнения выбранной реализации алгоритма устойчивой кластеризации с использованием связей в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:ROCK results 2.png|thumb|center|700px|Рисунок 2. Параллельная реализация алгоритма устойчивой кластеризации с использованием связей. Изменение времени выполнения кластеризации в зависимости от количества точек и от количества параллельных нитей.]]&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма была выполнена автором статьи.&amp;lt;ref&amp;gt;https://gitlab.com/viktorrulev/superprak-1/tree/master&amp;lt;/ref&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;
Алгоритм устойчивой кластеризации с иcпользованием связей реализован в пакете 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;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=21020</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=21020"/>
		<updated>2016-12-16T08:58:36Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: /* Программная реализация алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Teplov}}&lt;br /&gt;
&lt;br /&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо конечного множества), бинарными (принимающими только два значения, обычно &amp;lt;math&amp;gt;true&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;false&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с бинарными признаками. При этом алгоритм особенно эффективен, если у каждого объекта лишь небольшое количество признаков имеет значение &amp;lt;math&amp;gt;true&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся объектов &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть два объекта &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства &amp;lt;math&amp;gt;neighbour(p_1,p_2)&amp;lt;/math&amp;gt; этих объектов больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства &amp;lt;math&amp;gt;sim(p_1,p_2)&amp;lt;/math&amp;gt;. В ней &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; &amp;lt;math&amp;gt;link(p_1,p_2)&amp;lt;/math&amp;gt; между двумя объектами &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; будем называть количество общих соседей этих объектов.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика &amp;lt;math&amp;gt;goodness(C_i,C_j)&amp;lt;/math&amp;gt; достигает максимального значения среди всех пар кластеров. На начальном этапе каждый объект считается отдельным кластером.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
f(\theta)=\frac {1-\theta}{1+\theta}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\theta)}}&lt;br /&gt;
&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;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми объектами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждого объекта значительно меньше общего количества объектов, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма в общем случае можно оценить, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
или в случае небольшого количества соседних объектов для каждого объекта выборки, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Информационный граф перемножения плотных матриц с подробным описанием представлен в статье [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ниже представлен информационный граф наиболее интересного для рассмотрения этапа алгоритма устойчивой кластеризации с использованием связей - тела цикла (полупрозрачным показана следующая итерация цикла) при &amp;lt;math&amp;gt;n=5&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:rock-graph.png|thumb|center|1000px|Рисунок 1. Граф тела цикла; merge - объединение кластеров, insert - вставка goodness с новым кластером в упорядоченные списки соответствующих кластеров.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; высота ЯПФ равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, а внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга. Следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а высота ЯПФ равна &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи как &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, а ширина ЯПФ - как &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; объектах, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов объекта имеет значение &amp;quot;true&amp;quot;, каждый объект можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;true&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; индексов объектов, распределенных в &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; списков.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность последовательного алгоритма в общем случае равна &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt;, а в случае небольшого количества соседних объектов у каждого объекта сложность равна &amp;lt;math&amp;gt;O(M^{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (соотношение количества операций к объему входных и выходных данных) в общем случае равна O(M^{1.37}), в а случае небольшого количества соседних объектов (то есть в том случае, для которого и разрабатывался алгоритм) вычислительная мощность линейна.&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как показано выше, является квадратичным.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации алгоритма устройчивой кластеризации с использованием связей, выполненной с использованием OpenMP. Исследование проводилось на персональном компьютере HP Pavilion dv6 (процессор Intel Core i7 3610QM 2300 МГц, 8 логических ядер).&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число нитей [1 : 8] с шагом 1;&lt;br /&gt;
*	количество точек [500 : 1500] с шагом 100.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики времени выполнения выбранной реализации разложения Холецкого в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:ROCK results 2.png|thumb|center|700px|Рисунок 2. Параллельная реализация алгоритма устойчивой кластеризации с использованием связей. Изменение времени выполнения кластеризации в зависимости от количества точек и от количества параллельных нитей.]] &lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с иcпользованием связей реализован в пакете 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;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=21019</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=21019"/>
		<updated>2016-12-16T08:56:37Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: /* Свойства и структура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Teplov}}&lt;br /&gt;
&lt;br /&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо конечного множества), бинарными (принимающими только два значения, обычно &amp;lt;math&amp;gt;true&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;false&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с бинарными признаками. При этом алгоритм особенно эффективен, если у каждого объекта лишь небольшое количество признаков имеет значение &amp;lt;math&amp;gt;true&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся объектов &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть два объекта &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства &amp;lt;math&amp;gt;neighbour(p_1,p_2)&amp;lt;/math&amp;gt; этих объектов больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства &amp;lt;math&amp;gt;sim(p_1,p_2)&amp;lt;/math&amp;gt;. В ней &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; &amp;lt;math&amp;gt;link(p_1,p_2)&amp;lt;/math&amp;gt; между двумя объектами &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; будем называть количество общих соседей этих объектов.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика &amp;lt;math&amp;gt;goodness(C_i,C_j)&amp;lt;/math&amp;gt; достигает максимального значения среди всех пар кластеров. На начальном этапе каждый объект считается отдельным кластером.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
f(\theta)=\frac {1-\theta}{1+\theta}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\theta)}}&lt;br /&gt;
&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;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми объектами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждого объекта значительно меньше общего количества объектов, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма в общем случае можно оценить, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
или в случае небольшого количества соседних объектов для каждого объекта выборки, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Информационный граф перемножения плотных матриц с подробным описанием представлен в статье [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ниже представлен информационный граф наиболее интересного для рассмотрения этапа алгоритма устойчивой кластеризации с использованием связей - тела цикла (полупрозрачным показана следующая итерация цикла) при &amp;lt;math&amp;gt;n=5&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:rock-graph.png|thumb|center|1000px|Рисунок 1. Граф тела цикла; merge - объединение кластеров, insert - вставка goodness с новым кластером в упорядоченные списки соответствующих кластеров.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; высота ЯПФ равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, а внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга. Следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а высота ЯПФ равна &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи как &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, а ширина ЯПФ - как &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; объектах, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов объекта имеет значение &amp;quot;true&amp;quot;, каждый объект можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;true&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; индексов объектов, распределенных в &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; списков.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность последовательного алгоритма в общем случае равна &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt;, а в случае небольшого количества соседних объектов у каждого объекта сложность равна &amp;lt;math&amp;gt;O(M^{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (соотношение количества операций к объему входных и выходных данных) в общем случае равна O(M^{1.37}), в а случае небольшого количества соседних объектов (то есть в том случае, для которого и разрабатывался алгоритм) вычислительная мощность линейна.&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как показано выше, является квадратичным.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации алгоритма устройчивой кластеризации с использованием связей, выполненной с использованием OpenMP. Исследование проводилось на персональном компьютере HP Pavilion dv6 (процессор Intel Core i7 3610QM 2300 МГц, 8 логических ядер).&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число нитей [1 : 8] с шагом 1;&lt;br /&gt;
*	количество точек [500 : 1500] с шагом 100.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики времени выполнения выбранной реализации разложения Холецкого в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:ROCK results.png|thumb|center|700px|Рисунок 2. Параллельная реализация алгоритма устойчивой кластеризации с использованием связей. Изменение времени выполнения кластеризации в зависимости от количества точек и от количества параллельных нитей.]] &lt;br /&gt;
&lt;br /&gt;
&#039;&#039; &#039;&#039;&#039;Для проверяющего&#039;&#039;&#039;: я сделал OpenMP и MPI реализации этого алгоритма, но при запуске на Ломоносове они не дают никакого ускорения в зависимости от количества нитей/процессов. Я могу предоставить графики, показывающие это. Также я готов предоставить исходники обеих программ, но не могу выложить их на git.algowiki-project.org, потому что мне не приходит письмо с подтверждением регистрации.&#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;
Алгоритм устойчивой кластеризации с иcпользованием связей реализован в пакете 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;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=18974</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=18974"/>
		<updated>2016-11-22T18:19:27Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо множества) и другими. Множество значений, которые может принимать признак, называется доменом этого признака. Так, например, у объекта &#039;&#039;&#039;кошка&#039;&#039;&#039; может быть категорийный признак &#039;&#039;&#039;порода&#039;&#039;&#039;, доменом которого является множество &#039;&#039;&#039;[персидская, бенгальская, сфинкс, мейн-кун, ...]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с категорийными признаками.&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с использованием связей предназначен для работы с объектами типа &amp;quot;транзакция&amp;quot; (&amp;quot;покупательская корзина&amp;quot;). Транзакция представляет собой множество товаров, приобретенных покупателем у поставщика. Каждому товару, который есть в наличии у поставщика, в транзакции соответствует отдельный признак, который принимает значение &#039;&#039;&#039;true&#039;&#039;&#039;, если товар присутствует в транзакции, и &#039;&#039;&#039;false&#039;&#039;&#039;, если товар в транзакции отсутствует.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся транзакций &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть две транзакции &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства &amp;lt;math&amp;gt;neighbour(p_1,p_2)&amp;lt;/math&amp;gt; этих транзакций больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства &amp;lt;math&amp;gt;sim(p_1,p_2)&amp;lt;/math&amp;gt;. В ней &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; &amp;lt;math&amp;gt;link(p_1,p_2)&amp;lt;/math&amp;gt; между двумя транзакциями &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; будем называть количество общих соседей этих транзакций.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика &amp;lt;math&amp;gt;goodness(C_i,C_j)&amp;lt;/math&amp;gt; достигает максимального значения среди всех пар кластеров. На начальном этапе каждая транзакция считается отдельным кластером.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
f(\theta)=\frac {1-\theta}{1+\theta}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\theta)}}&lt;br /&gt;
&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;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних транзакций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми транзакциями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждой транзакции значительно меньше общего количества транзакций, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей транзакции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет такую же вычислительную сложность, как и предыдущий шаг.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма в общем случае можно оценить, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
или в случае небольшого количества соседних транзакций, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Информационный граф перемножения плотных матриц с подробным описанием представлен в статье [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ниже представлен информационный граф наиболее интересного для рассмотрения этапа алгоритма устойчивой кластеризации с использованием связей - тела цикла (полупрозрачным показана следующая итерация цикла) при &amp;lt;math&amp;gt;n=5&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:Rock-graph.png|thumb|center|1000px|Рисунок 1. Граф тела цикла; merge - объединение кластеров, insert - вставка goodness с новым кластером в упорядоченные списки соответствующих кластеров.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; высота ЯПФ равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, а внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга. Следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а высота ЯПФ равна &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи как &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, а ширина ЯПФ - как &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; транзакциях, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов транзакции имеет значение &amp;quot;1&amp;quot;, каждую транзакцию можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; индексов транзакций, распределенных в &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; списков.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность последовательного алгоритма в общем случае равна &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt;, а в случае небольшого количества соседних транзакций у каждой транзакции сложность равна &amp;lt;math&amp;gt;O(M^{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (соотношение количества операций к объему входных и выходных данных) в общем случае равна O(M^{1.37}), в а случае небольшого количества соседних транзакций (то есть в том случае, для которого и разрабатывался алгоритм) вычислительная мощность линейна.&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как показано выше, является квадратичным.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации алгоритма устройчивой кластеризации с использованием связей, выполненной с использованием OpenMP. Исследование проводилось на персональном компьютере HP Pavilion dv6 (процессор Intel Core i7 3610QM 2300 МГц, 8 логических ядер).&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число нитей [1 : 8] с шагом 1;&lt;br /&gt;
*	количество точек [500 : 1500] с шагом 100.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики времени выполнения выбранной реализации разложения Холецкого в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:ROCK results.png|thumb|center|700px|Рисунок 2. Параллельная реализация алгоритма устойчивой кластеризации с использованием связей. Изменение времени выполнения кластеризации в зависимости от количества точек и от количества параллельных нитей.]] &lt;br /&gt;
&lt;br /&gt;
&#039;&#039; &#039;&#039;&#039;Для проверяющего&#039;&#039;&#039;: я сделал OpenMP и MPI реализации этого алгоритма, но при запуске на Ломоносове они не дают никакого ускорения в зависимости от количества нитей/процессов. Я могу предоставить графики, показывающие это. Также я готов предоставить исходники обеих программ, но не могу выложить их на git.algowiki-project.org, потому что мне не приходит письмо с подтверждением регистрации.&#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;
Алгоритм устойчивой кластеризации с иcпользованием связей реализован в пакете 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;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=18973</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=18973"/>
		<updated>2016-11-22T18:18:52Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо множества) и другими. Множество значений, которые может принимать признак, называется доменом этого признака. Так, например, у объекта &#039;&#039;&#039;кошка&#039;&#039;&#039; может быть категорийный признак &#039;&#039;&#039;порода&#039;&#039;&#039;, доменом которого является множество &#039;&#039;&#039;[персидская, бенгальская, сфинкс, мейн-кун, ...]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с категорийными признаками.&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с использованием связей предназначен для работы с объектами типа &amp;quot;транзакция&amp;quot; (&amp;quot;покупательская корзина&amp;quot;). Транзакция представляет собой множество товаров, приобретенных покупателем у поставщика. Каждому товару, который есть в наличии у поставщика, в транзакции соответствует отдельный признак, который принимает значение &#039;&#039;&#039;true&#039;&#039;&#039;, если товар присутствует в транзакции, и &#039;&#039;&#039;false&#039;&#039;&#039;, если товар в транзакции отсутствует.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся транзакций &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть две транзакции &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства &amp;lt;math&amp;gt;neighbour(p_1,p_2)&amp;lt;/math&amp;gt; этих транзакций больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства &amp;lt;math&amp;gt;sim(p_1,p_2)&amp;lt;/math&amp;gt;. В ней &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; &amp;lt;math&amp;gt;link(p_1,p_2)&amp;lt;/math&amp;gt; между двумя транзакциями &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; будем называть количество общих соседей этих транзакций.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика &amp;lt;math&amp;gt;goodness(C_i,C_j)&amp;lt;/math&amp;gt; достигает максимального значения среди всех пар кластеров. На начальном этапе каждая транзакция считается отдельным кластером.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
f(\theta)=\frac {1-\theta}{1+\theta}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\theta)}}&lt;br /&gt;
&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;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних транзакций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми транзакциями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждой транзакции значительно меньше общего количества транзакций, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей транзакции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет такую же вычислительную сложность, как и предыдущий шаг.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма в общем случае можно оценить, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
или в случае небольшого количества соседних транзакций, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Информационный граф перемножения плотных матриц с подробным описанием представлен в статье [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ниже представлен информационный граф наиболее интересного для рассмотрения этапа алгоритма устойчивой кластеризации с использованием связей - тела цикла (полупрозрачным показана следующая итерация цикла) при &amp;lt;math&amp;gt;n=5&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:Rock-graph.png|thumb|center|1000px|Рисунок 1. Граф тела цикла; merge - объединение кластеров, insert - вставка goodness с новым кластером в упорядоченные списки соответствующих кластеров.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; высота ЯПФ равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, а внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга. Следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а высота ЯПФ равна &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи как &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, а ширина ЯПФ - как &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; транзакциях, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов транзакции имеет значение &amp;quot;1&amp;quot;, каждую транзакцию можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; индексов транзакций, распределенных в &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; списков.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность последовательного алгоритма в общем случае равна &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt;, а в случае небольшого количества соседних транзакций у каждой транзакции сложность равна &amp;lt;math&amp;gt;O(M^{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (соотношение количества операций к объему входных и выходных данных) в общем случае равна O(M^{1.37}), в а случае небольшого количества соседних транзакций (то есть в том случае, для которого и разрабатывался алгоритм) вычислительная мощность линейна.&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как показано выше, является квадратичным.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации алгоритма устройчивой кластеризации с использованием связей, выполненной с использованием OpenMP. Исследование проводилось на персональном компьютере HP Pavilion dv6 (процессор Intel Core i7 3610QM 2300 МГц, 8 логических ядер).&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число нитей [1 : 8] с шагом 1;&lt;br /&gt;
*	количество точек [500 : 1500] с шагом 100.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики времени выполнения выбранной реализации разложения Холецкого в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:ROCK results.png|thumb|center|700px|Рисунок 2. Параллельная реализация алгоритма устойчивой кластеризации с использованием связей. Изменение времени выполнения кластеризации в зависимости от количества точек и от количества параллельных нитей.]] &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Для проверяющих: я сделал OpenMP и MPI реализации этого алгоритма, но при запуске на Ломоносове они не дают никакого ускорения в зависимости от количества нитей/процессов. Я могу предоставить графики, показывающие это. Также я готов предоставить исходники обеих программ, но не могу выложить их на git.algowiki-project.org, потому что мне не приходит письмо с подтверждением регистрации.&#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;
Алгоритм устойчивой кластеризации с иcпользованием связей реализован в пакете 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;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=18972</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=18972"/>
		<updated>2016-11-22T18:18:20Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо множества) и другими. Множество значений, которые может принимать признак, называется доменом этого признака. Так, например, у объекта &#039;&#039;&#039;кошка&#039;&#039;&#039; может быть категорийный признак &#039;&#039;&#039;порода&#039;&#039;&#039;, доменом которого является множество &#039;&#039;&#039;[персидская, бенгальская, сфинкс, мейн-кун, ...]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с категорийными признаками.&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с использованием связей предназначен для работы с объектами типа &amp;quot;транзакция&amp;quot; (&amp;quot;покупательская корзина&amp;quot;). Транзакция представляет собой множество товаров, приобретенных покупателем у поставщика. Каждому товару, который есть в наличии у поставщика, в транзакции соответствует отдельный признак, который принимает значение &#039;&#039;&#039;true&#039;&#039;&#039;, если товар присутствует в транзакции, и &#039;&#039;&#039;false&#039;&#039;&#039;, если товар в транзакции отсутствует.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся транзакций &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть две транзакции &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства &amp;lt;math&amp;gt;neighbour(p_1,p_2)&amp;lt;/math&amp;gt; этих транзакций больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства &amp;lt;math&amp;gt;sim(p_1,p_2)&amp;lt;/math&amp;gt;. В ней &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; &amp;lt;math&amp;gt;link(p_1,p_2)&amp;lt;/math&amp;gt; между двумя транзакциями &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; будем называть количество общих соседей этих транзакций.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика &amp;lt;math&amp;gt;goodness(C_i,C_j)&amp;lt;/math&amp;gt; достигает максимального значения среди всех пар кластеров. На начальном этапе каждая транзакция считается отдельным кластером.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
f(\theta)=\frac {1-\theta}{1+\theta}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\theta)}}&lt;br /&gt;
&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;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних транзакций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми транзакциями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждой транзакции значительно меньше общего количества транзакций, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей транзакции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет такую же вычислительную сложность, как и предыдущий шаг.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма в общем случае можно оценить, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
или в случае небольшого количества соседних транзакций, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Информационный граф перемножения плотных матриц с подробным описанием представлен в статье [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ниже представлен информационный граф наиболее интересного для рассмотрения этапа алгоритма устойчивой кластеризации с использованием связей - тела цикла (полупрозрачным показана следующая итерация цикла) при &amp;lt;math&amp;gt;n=5&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:Rock-graph.png|thumb|center|1000px|Рисунок 1. Граф тела цикла; merge - объединение кластеров, insert - вставка goodness с новым кластером в упорядоченные списки соответствующих кластеров.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; высота ЯПФ равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, а внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга. Следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а высота ЯПФ равна &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи как &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, а ширина ЯПФ - как &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; транзакциях, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов транзакции имеет значение &amp;quot;1&amp;quot;, каждую транзакцию можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; индексов транзакций, распределенных в &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; списков.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность последовательного алгоритма в общем случае равна &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt;, а в случае небольшого количества соседних транзакций у каждой транзакции сложность равна &amp;lt;math&amp;gt;O(M^{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (соотношение количества операций к объему входных и выходных данных) в общем случае равна O(M^{1.37}), в а случае небольшого количества соседних транзакций (то есть в том случае, для которого и разрабатывался алгоритм) вычислительная мощность линейна.&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как показано выше, является квадратичным.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации алгоритма устройчивой кластеризации с использованием связей, выполненной с использованием OpenMP. Исследование проводилось на персональном компьютере HP Pavilion dv6 (процессор Intel Core i7 3610QM 2300 МГц, 8 логических ядер).&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число нитей [1 : 8] с шагом 1;&lt;br /&gt;
*	количество точек [500 : 1500] с шагом 100.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики времени выполнения выбранной реализации разложения Холецкого в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:ROCK results.png|thumb|center|700px|Рисунок 1. Параллельная реализация алгоритма устойчивой кластеризации с использованием связей. Изменение времени выполнения кластеризации в зависимости от количества точек и от количества параллельных нитей.]] &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Для проверяющих: я сделал OpenMP и MPI реализации этого алгоритма, но при запуске на Ломоносове они не дают никакого ускорения в зависимости от количества нитей/процессов. Я могу предоставить графики, показывающие это. Также я готов предоставить исходники обеих программ, но не могу выложить их на git.algowiki-project.org, потому что мне не приходит письмо с подтверждением регистрации.&#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;
Алгоритм устойчивой кластеризации с иcпользованием связей реализован в пакете 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;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=18971</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=18971"/>
		<updated>2016-11-22T18:17:37Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо множества) и другими. Множество значений, которые может принимать признак, называется доменом этого признака. Так, например, у объекта &#039;&#039;&#039;кошка&#039;&#039;&#039; может быть категорийный признак &#039;&#039;&#039;порода&#039;&#039;&#039;, доменом которого является множество &#039;&#039;&#039;[персидская, бенгальская, сфинкс, мейн-кун, ...]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с категорийными признаками.&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с использованием связей предназначен для работы с объектами типа &amp;quot;транзакция&amp;quot; (&amp;quot;покупательская корзина&amp;quot;). Транзакция представляет собой множество товаров, приобретенных покупателем у поставщика. Каждому товару, который есть в наличии у поставщика, в транзакции соответствует отдельный признак, который принимает значение &#039;&#039;&#039;true&#039;&#039;&#039;, если товар присутствует в транзакции, и &#039;&#039;&#039;false&#039;&#039;&#039;, если товар в транзакции отсутствует.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся транзакций &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть две транзакции &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства &amp;lt;math&amp;gt;neighbour(p_1,p_2)&amp;lt;/math&amp;gt; этих транзакций больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства &amp;lt;math&amp;gt;sim(p_1,p_2)&amp;lt;/math&amp;gt;. В ней &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; &amp;lt;math&amp;gt;link(p_1,p_2)&amp;lt;/math&amp;gt; между двумя транзакциями &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; будем называть количество общих соседей этих транзакций.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика &amp;lt;math&amp;gt;goodness(C_i,C_j)&amp;lt;/math&amp;gt; достигает максимального значения среди всех пар кластеров. На начальном этапе каждая транзакция считается отдельным кластером.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
f(\theta)=\frac {1-\theta}{1+\theta}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\theta)}}&lt;br /&gt;
&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;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних транзакций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми транзакциями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждой транзакции значительно меньше общего количества транзакций, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей транзакции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет такую же вычислительную сложность, как и предыдущий шаг.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма в общем случае можно оценить, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
или в случае небольшого количества соседних транзакций, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Информационный граф перемножения плотных матриц с подробным описанием представлен в статье [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ниже представлен информационный граф наиболее интересного для рассмотрения этапа алгоритма устойчивой кластеризации с использованием связей - тела цикла (полупрозрачным показана следующая итерация цикла) при &amp;lt;math&amp;gt;n=5&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:Rock-graph.png|thumb|center|1000px|Рисунок 1. Граф тела цикла; merge - объединение кластеров, insert - вставка goodness с новым кластером в упорядоченные списки соответствующих кластеров.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; высота ЯПФ равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, а внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга. Следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а высота ЯПФ равна &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи как &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, а ширина ЯПФ - как &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; транзакциях, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов транзакции имеет значение &amp;quot;1&amp;quot;, каждую транзакцию можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; индексов транзакций, распределенных в &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; списков.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность последовательного алгоритма в общем случае равна &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt;, а в случае небольшого количества соседних транзакций у каждой транзакции сложность равна &amp;lt;math&amp;gt;O(M^{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (соотношение количества операций к объему входных и выходных данных) в общем случае равна O(M^{1.37}), в а случае небольшого количества соседних транзакций (то есть в том случае, для которого и разрабатывался алгоритм) вычислительная мощность линейна.&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как показано выше, является квадратичным.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации алгоритма устройчивой кластеризации с использованием связей, выполненной с использованием OpenMP. Исследование проводилось на персональном компьютере HP Pavilion dv6 (процессор Intel Core i7 3610QM 2300 МГц, 8 логических ядер).&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число нитей [1 : 8] с шагом 1;&lt;br /&gt;
*	количество точек [500 : 1500] с шагом 100.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики времени выполнения выбранной реализации разложения Холецкого в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:ROCK results.png|thumb|center|700px|Рисунок 1. Параллельная реализация алгоритма устойчивой кластеризации с использованием связей. Изменение времени выполнения кластеризации в зависимости от количества точек и от количества параллельных нитей.]] &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Для проверяющих: я сделал OpenMP и MPI реализации этого алгоритма, но при запуске на Ломоносове они не дают никакого ускорения в зависимости от количества нитей/процессов. Я могу предоставить графики, показывающие это. Также я готов предоставить исходники обеих программ, но не могу выложить их на git.algowiki-project.org, потому что мне не приходит письмо с подтверждением регистрации.&#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;
Алгоритм устойчивой кластеризации с иcпользованием связей реализован в пакете 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;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=15334</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=15334"/>
		<updated>2016-10-31T20:15:17Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо множества) и другими. Множество значений, которые может принимать признак, называется доменом этого признака. Так, например, у объекта &#039;&#039;&#039;кошка&#039;&#039;&#039; может быть категорийный признак &#039;&#039;&#039;порода&#039;&#039;&#039;, доменом которого является множество &#039;&#039;&#039;[персидская, бенгальская, сфинкс, мейн-кун, ...]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с категорийными признаками.&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с использованием связей предназначен для работы с объектами типа &amp;quot;транзакция&amp;quot; (&amp;quot;покупательская корзина&amp;quot;). Транзакция представляет собой множество товаров, приобретенных покупателем у поставщика. Каждому товару, который есть в наличии у поставщика, в транзакции соответствует отдельный признак, который принимает значение &#039;&#039;&#039;true&#039;&#039;&#039;, если товар присутствует в транзакции, и &#039;&#039;&#039;false&#039;&#039;&#039;, если товар в транзакции отсутствует.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся транзакций &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть две транзакции &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства &amp;lt;math&amp;gt;neighbour(p_1,p_2)&amp;lt;/math&amp;gt; этих транзакций больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства &amp;lt;math&amp;gt;sim(p_1,p_2)&amp;lt;/math&amp;gt;. В ней &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; &amp;lt;math&amp;gt;link(p_1,p_2)&amp;lt;/math&amp;gt; между двумя транзакциями &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; будем называть количество общих соседей этих транзакций.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика &amp;lt;math&amp;gt;goodness(C_i,C_j)&amp;lt;/math&amp;gt; достигает максимального значения среди всех пар кластеров. На начальном этапе каждая транзакция считается отдельным кластером.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
f(\theta)=\frac {1-\theta}{1+\theta}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\theta)}}&lt;br /&gt;
&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;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних транзакций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми транзакциями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждой транзакции значительно меньше общего количества транзакций, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей транзакции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет такую же вычислительную сложность, как и предыдущий шаг.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма в общем случае можно оценить, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
или в случае небольшого количества соседних транзакций, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Информационный граф перемножения плотных матриц с подробным описанием представлен в статье [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ниже представлен информационный граф наиболее интересного для рассмотрения этапа алгоритма устойчивой кластеризации с использованием связей - тела цикла (полупрозрачным показана следующая итерация цикла) при &amp;lt;math&amp;gt;n=5&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:Rock-graph.png|thumb|center|1000px|Рисунок 1. Граф тела цикла; merge - объединение кластеров, insert - вставка goodness с новым кластером в упорядоченные списки соответствующих кластеров.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; высота ЯПФ равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, а внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга. Следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а высота ЯПФ равна &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи как &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, а ширина ЯПФ - как &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; транзакциях, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов транзакции имеет значение &amp;quot;1&amp;quot;, каждую транзакцию можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; индексов транзакций, распределенных в &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; списков.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность последовательного алгоритма в общем случае равна &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt;, а в случае небольшого количества соседних транзакций у каждой транзакции сложность равна &amp;lt;math&amp;gt;O(M^{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (соотношение количества операций к объему входных и выходных данных) в общем случае равна O(M^{1.37}), в а случае небольшого количества соседних транзакций (то есть в том случае, для которого и разрабатывался алгоритм) вычислительная мощность линейна.&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как показано выше, является квадратичным.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с иcпользованием связей реализован в пакете 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;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Viktorrulev&amp;diff=13896</id>
		<title>Обсуждение участника:Viktorrulev</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Viktorrulev&amp;diff=13896"/>
		<updated>2016-10-26T09:18:43Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:Viktorrulev/Алгоритм устойчивой кластеризации с иcпользованием связей]] ==&lt;br /&gt;
&lt;br /&gt;
=== Замечания ===&lt;br /&gt;
* Формулы нужно оформить в отдельные блоки для лучшей читаемости [[Участник:Teplov|Teplov]] ([[Обсуждение участника:Teplov|обсуждение]]) 01:13, 23 октября 2016 (MSK)&lt;br /&gt;
:: Исправлено (сделать все формулы в одном блоке и выровнять по левой стороне вики не позволяет) [[Участник:Viktorrulev|Viktorrulev]] ([[Обсуждение участника:Viktorrulev|обсуждение]]) 12:18, 26 октября 2016 (MSK)&lt;br /&gt;
* В п. 2.7 необходимо указать ссылку на источник [[Участник:Teplov|Teplov]] ([[Обсуждение участника:Teplov|обсуждение]]) 01:13, 23 октября 2016 (MSK)&lt;br /&gt;
:: Исправлено [[Участник:Viktorrulev|Viktorrulev]] ([[Обсуждение участника:Viktorrulev|обсуждение]]) 12:18, 26 октября 2016 (MSK)&lt;br /&gt;
* В п. 1.5 указать на каком языке представлена реализация [[Участник:Teplov|Teplov]] ([[Обсуждение участника:Teplov|обсуждение]]) 01:13, 23 октября 2016 (MSK)&lt;br /&gt;
:: Исправлено [[Участник:Viktorrulev|Viktorrulev]] ([[Обсуждение участника:Viktorrulev|обсуждение]]) 12:18, 26 октября 2016 (MSK)&lt;br /&gt;
* В п. в п. 1.7  не указано для каких параметров построен граф. [[Участник:Teplov|Teplov]] ([[Обсуждение участника:Teplov|обсуждение]]) 01:13, 23 октября 2016 (MSK)&lt;br /&gt;
:: Исправлено [[Участник:Viktorrulev|Viktorrulev]] ([[Обсуждение участника:Viktorrulev|обсуждение]]) 12:18, 26 октября 2016 (MSK)&lt;br /&gt;
* Нужно более полное описание вычислительной мощности алгоритма [[Участник:Teplov|Teplov]] ([[Обсуждение участника:Teplov|обсуждение]]) 01:13, 23 октября 2016 (MSK)&lt;br /&gt;
:: Дополнено [[Участник:Viktorrulev|Viktorrulev]] ([[Обсуждение участника:Viktorrulev|обсуждение]]) 12:18, 26 октября 2016 (MSK)&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=13895</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=13895"/>
		<updated>2016-10-26T09:18:24Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо множества) и другими. Множество значений, которые может принимать признак, называется доменом этого признака. Так, например, у объекта &#039;&#039;&#039;кошка&#039;&#039;&#039; может быть категорийный признак &#039;&#039;&#039;порода&#039;&#039;&#039;, доменом которого является множество &#039;&#039;&#039;[персидская, бенгальская, сфинкс, мейн-кун, ...]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с категорийными признаками.&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с использованием связей предназначен для работы с объектами типа &amp;quot;транзакция&amp;quot; (&amp;quot;покупательская корзина&amp;quot;). Транзакция представляет собой множество товаров, приобретенных покупателем у поставщика. Каждому товару, который есть в наличии у поставщика, в транзакции соответствует отдельный признак, который принимает значение &#039;&#039;&#039;true&#039;&#039;&#039;, если товар присутствует в транзакции, и &#039;&#039;&#039;false&#039;&#039;&#039;, если товар в транзакции отсутствует.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся транзакций &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть две транзакции &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства &amp;lt;math&amp;gt;neighbour(p_1,p_2)&amp;lt;/math&amp;gt; этих транзакций больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства &amp;lt;math&amp;gt;sim(p_1,p_2)&amp;lt;/math&amp;gt;. В ней &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; &amp;lt;math&amp;gt;link(p_1,p_2)&amp;lt;/math&amp;gt; между двумя транзакциями &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; будем называть количество общих соседей этих транзакций.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика &amp;lt;math&amp;gt;goodness(C_i,C_j)&amp;lt;/math&amp;gt; достигает максимального значения среди всех пар кластеров. На начальном этапе каждая транзакция считается отдельным кластером.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
f(\theta)=\frac {1-\theta}{1+\theta}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\theta)}}&lt;br /&gt;
&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;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних транзакций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми транзакциями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждой транзакции значительно меньше общего количества транзакций, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей транзакции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет такую же вычислительную сложность, как и предыдущий шаг.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма в общем случае можно оценить, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
или в случае небольшого количества соседних транзакций, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Информационный граф перемножения плотных матриц с подробным описанием представлен в статье [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ниже представлен информационный граф наиболее интересного для рассмотрения этапа алгоритма устойчивой кластеризации с использованием связей - тела цикла (полупрозрачным показана следующая итерация цикла) при &amp;lt;math&amp;gt;n=5&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:Rock-graph.png|thumb|center|1000px|Рисунок 1. Граф тела цикла; merge - объединение кластеров, insert - вставка goodness с новым кластером в упорядоченные списки соответствующих кластеров.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; высота ЯПФ равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, а внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга. Следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а высота ЯПФ равна &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи как &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, а ширина ЯПФ - как &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; транзакциях, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов транзакции имеет значение &amp;quot;1&amp;quot;, каждую транзакцию можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; индексов транзакций, распределенных в &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; списков.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность последовательного алгоритма в общем случае равна &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt;, а в случае небольшого количества соседних транзакций у каждой транзакции сложность равна &amp;lt;math&amp;gt;O(M^{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (соотношение количества операций к объему входных и выходных данных) в общем случае равна O(M^{1.37}), в а случае небольшого количества соседних транзакций (то есть в том случае, для которого и разрабатывался алгоритм) вычислительная мощность линейна.&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как показано выше, является квадратичным.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с иcпользованием связей реализован в пакете 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;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=13894</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=13894"/>
		<updated>2016-10-26T09:15:03Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо множества) и другими. Множество значений, которые может принимать признак, называется доменом этого признака. Так, например, у объекта &#039;&#039;&#039;кошка&#039;&#039;&#039; может быть категорийный признак &#039;&#039;&#039;порода&#039;&#039;&#039;, доменом которого является множество &#039;&#039;&#039;[персидская, бенгальская, сфинкс, мейн-кун, ...]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с категорийными признаками.&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с использованием связей предназначен для работы с объектами типа &amp;quot;транзакция&amp;quot; (&amp;quot;покупательская корзина&amp;quot;). Транзакция представляет собой множество товаров, приобретенных покупателем у поставщика. Каждому товару, который есть в наличии у поставщика, в транзакции соответствует отдельный признак, который принимает значение &#039;&#039;&#039;true&#039;&#039;&#039;, если товар присутствует в транзакции, и &#039;&#039;&#039;false&#039;&#039;&#039;, если товар в транзакции отсутствует.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся транзакций &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть две транзакции &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства &amp;lt;math&amp;gt;neighbour(p_1,p_2)&amp;lt;/math&amp;gt; этих транзакций больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства &amp;lt;math&amp;gt;sim(p_1,p_2)&amp;lt;/math&amp;gt;. В ней &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; &amp;lt;math&amp;gt;link(p_1,p_2)&amp;lt;/math&amp;gt; между двумя транзакциями &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; будем называть количество общих соседей этих транзакций.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика &amp;lt;math&amp;gt;goodness(C_i,C_j)&amp;lt;/math&amp;gt; достигает максимального значения среди всех пар кластеров. На начальном этапе каждая транзакция считается отдельным кластером.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
f(\theta)=\frac {1-\theta}{1+\theta}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\theta)}}&lt;br /&gt;
&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;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних транзакций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми транзакциями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждой транзакции значительно меньше общего количества транзакций, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей транзакции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет такую же вычислительную сложность, как и предыдущий шаг.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма в общем случае можно оценить, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
или в случае небольшого количества соседних транзакций, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Информационный граф перемножения плотных матриц с подробным описанием представлен в статье [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ниже представлен информационный граф наиболее интересного для рассмотрения этапа алгоритма устойчивой кластеризации с использованием связей - тела цикла (полупрозрачным показана следующая итерация цикла) при &amp;lt;math&amp;gt;n=5&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:Rock-graph.png|thumb|center|1000px|Рисунок 1. Граф тела цикла; merge - объединение кластеров, insert - вставка goodness с новым кластером в упорядоченные списки соответствующих кластеров.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; высота ЯПФ равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, а внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга. Следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а высота ЯПФ равна &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи как &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, а ширина ЯПФ - как &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; транзакциях, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов транзакции имеет значение &amp;quot;1&amp;quot;, каждую транзакцию можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с иcпользованием связей реализован в пакете 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;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=13893</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=13893"/>
		<updated>2016-10-26T09:14:45Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо множества) и другими. Множество значений, которые может принимать признак, называется доменом этого признака. Так, например, у объекта &#039;&#039;&#039;кошка&#039;&#039;&#039; может быть категорийный признак &#039;&#039;&#039;порода&#039;&#039;&#039;, доменом которого является множество &#039;&#039;&#039;[персидская, бенгальская, сфинкс, мейн-кун, ...]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с категорийными признаками.&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с использованием связей предназначен для работы с объектами типа &amp;quot;транзакция&amp;quot; (&amp;quot;покупательская корзина&amp;quot;). Транзакция представляет собой множество товаров, приобретенных покупателем у поставщика. Каждому товару, который есть в наличии у поставщика, в транзакции соответствует отдельный признак, который принимает значение &#039;&#039;&#039;true&#039;&#039;&#039;, если товар присутствует в транзакции, и &#039;&#039;&#039;false&#039;&#039;&#039;, если товар в транзакции отсутствует.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся транзакций &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть две транзакции &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства &amp;lt;math&amp;gt;neighbour(p_1,p_2)&amp;lt;/math&amp;gt; этих транзакций больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства &amp;lt;math&amp;gt;sim(p_1,p_2)&amp;lt;/math&amp;gt;. В ней &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; &amp;lt;math&amp;gt;link(p_1,p_2)&amp;lt;/math&amp;gt; между двумя транзакциями &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; будем называть количество общих соседей этих транзакций.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика &amp;lt;math&amp;gt;goodness(C_i,C_j)&amp;lt;/math&amp;gt; достигает максимального значения среди всех пар кластеров. На начальном этапе каждая транзакция считается отдельным кластером.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
f(\theta)=\frac {1-\theta}{1+\theta}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\theta)}}&lt;br /&gt;
&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;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних транзакций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми транзакциями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждой транзакции значительно меньше общего количества транзакций, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей транзакции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет такую же вычислительную сложность, как и предыдущий шаг.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма в общем случае можно оценить, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
или в случае небольшого количества соседних транзакций, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Информационный граф перемножения плотных матриц с подробным описанием представлен в статье [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ниже представлен информационный граф наиболее интересного для рассмотрения этапа алгоритма устойчивой кластеризации с использованием связей - тела цикла (полупрозрачным показана следующая итерация цикла) при &amp;lt;math&amp;gt;n=5&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:Rock-graph.png|thumb|center|1000px|Рисунок 1. Граф тела цикла; merge - объединение кластеров, insert - вставка goodness с новым кластером в упорядоченные списки соответствующих кластеров.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; высота ЯПФ равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, а внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга. Следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а высота ЯПФ равна &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи как math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, а ширина ЯПФ - как &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; транзакциях, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов транзакции имеет значение &amp;quot;1&amp;quot;, каждую транзакцию можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с иcпользованием связей реализован в пакете 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;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=13892</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=13892"/>
		<updated>2016-10-26T09:09:49Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо множества) и другими. Множество значений, которые может принимать признак, называется доменом этого признака. Так, например, у объекта &#039;&#039;&#039;кошка&#039;&#039;&#039; может быть категорийный признак &#039;&#039;&#039;порода&#039;&#039;&#039;, доменом которого является множество &#039;&#039;&#039;[персидская, бенгальская, сфинкс, мейн-кун, ...]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с категорийными признаками.&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с использованием связей предназначен для работы с объектами типа &amp;quot;транзакция&amp;quot; (&amp;quot;покупательская корзина&amp;quot;). Транзакция представляет собой множество товаров, приобретенных покупателем у поставщика. Каждому товару, который есть в наличии у поставщика, в транзакции соответствует отдельный признак, который принимает значение &#039;&#039;&#039;true&#039;&#039;&#039;, если товар присутствует в транзакции, и &#039;&#039;&#039;false&#039;&#039;&#039;, если товар в транзакции отсутствует.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся транзакций &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть две транзакции &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства &amp;lt;math&amp;gt;neighbour(p_1,p_2)&amp;lt;/math&amp;gt; этих транзакций больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства &amp;lt;math&amp;gt;sim(p_1,p_2)&amp;lt;/math&amp;gt;. В ней &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; &amp;lt;math&amp;gt;link(p_1,p_2)&amp;lt;/math&amp;gt; между двумя транзакциями &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; будем называть количество общих соседей этих транзакций.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика &amp;lt;math&amp;gt;goodness(C_i,C_j)&amp;lt;/math&amp;gt; достигает максимального значения среди всех пар кластеров. На начальном этапе каждая транзакция считается отдельным кластером.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
f(\theta)=\frac {1-\theta}{1+\theta}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\theta)}}&lt;br /&gt;
&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;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних транзакций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми транзакциями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждой транзакции значительно меньше общего количества транзакций, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей транзакции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет такую же вычислительную сложность, как и предыдущий шаг.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма в общем случае можно оценить, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
или в случае небольшого количества соседних транзакций, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Информационный граф перемножения плотных матриц с подробным описанием представлен в статье [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ниже представлен информационный граф наиболее интересного для рассмотрения этапа алгоритма устойчивой кластеризации с использованием связей - тела цикла (полупрозрачным показана следующая итерация цикла) при &amp;lt;math&amp;gt;n=5&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:Rock-graph.png|thumb|center|1000px|Рисунок 1. Граф тела цикла; merge - объединение кластеров, insert - вставка goodness с новым кластером в упорядоченные списки соответствующих кластеров.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; высота ЯПФ равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, а внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга. Следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а высота ЯПФ равна &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи линейно, а ширина ЯПФ - квадратично.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; транзакциях, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов транзакции имеет значение &amp;quot;1&amp;quot;, каждую транзакцию можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с иcпользованием связей реализован в пакете 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;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=13881</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=13881"/>
		<updated>2016-10-26T08:39:38Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо множества) и другими. Множество значений, которые может принимать признак, называется доменом этого признака. Так, например, у объекта &#039;&#039;&#039;кошка&#039;&#039;&#039; может быть категорийный признак &#039;&#039;&#039;порода&#039;&#039;&#039;, доменом которого является множество &#039;&#039;&#039;[персидская, бенгальская, сфинкс, мейн-кун, ...]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с категорийными признаками.&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с использованием связей предназначен для работы с объектами типа &amp;quot;транзакция&amp;quot; (&amp;quot;покупательская корзина&amp;quot;). Транзакция представляет собой множество товаров, приобретенных покупателем у поставщика. Каждому товару, который есть в наличии у поставщика, в транзакции соответствует отдельный признак, который принимает значение &#039;&#039;&#039;true&#039;&#039;&#039;, если товар присутствует в транзакции, и &#039;&#039;&#039;false&#039;&#039;&#039;, если товар в транзакции отсутствует.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся транзакций &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть две транзакции &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства &amp;lt;math&amp;gt;neighbour(p_1,p_2)&amp;lt;/math&amp;gt; этих транзакций больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства &amp;lt;math&amp;gt;sim(p_1,p_2)&amp;lt;/math&amp;gt;. В ней &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; &amp;lt;math&amp;gt;link(p_1,p_2)&amp;lt;/math&amp;gt; между двумя транзакциями &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; будем называть количество общих соседей этих транзакций.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика &amp;lt;math&amp;gt;goodness(C_i,C_j)&amp;lt;/math&amp;gt; достигает максимального значения среди всех пар кластеров. На начальном этапе каждая транзакция считается отдельным кластером.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
f(\theta)=\frac {1-\theta}{1+\theta}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\theta)}}&lt;br /&gt;
&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;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних транзакций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми транзакциями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждой транзакции значительно меньше общего количества транзакций, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей транзакции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет такую же вычислительную сложность, как и предыдущий шаг.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма можно оценить, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt;&lt;br /&gt;
или&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Информационный граф перемножения плотных матриц с подробным описанием представлен в статье [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ниже представлен информационный граф наиболее интересного для рассмотрения этапа алгоритма устойчивой кластеризации с использованием связей - тела цикла (полупрозрачным показана следующая итерация цикла) при &amp;lt;math&amp;gt;n=5&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:Rock-graph.png|thumb|center|1000px|Рисунок 1. Граф тела цикла; merge - объединение кластеров, insert - вставка goodness с новым кластером в упорядоченные списки соответствующих кластеров.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; высота ЯПФ равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, а внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга. Следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а высота ЯПФ равна &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи линейно, а ширина ЯПФ - квадратично.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; транзакциях, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов транзакции имеет значение &amp;quot;1&amp;quot;, каждую транзакцию можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с иcпользованием связей реализован в пакете 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;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=13880</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=13880"/>
		<updated>2016-10-26T08:39:24Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо множества) и другими. Множество значений, которые может принимать признак, называется доменом этого признака. Так, например, у объекта &#039;&#039;&#039;кошка&#039;&#039;&#039; может быть категорийный признак &#039;&#039;&#039;порода&#039;&#039;&#039;, доменом которого является множество &#039;&#039;&#039;[персидская, бенгальская, сфинкс, мейн-кун, ...]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с категорийными признаками.&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с использованием связей предназначен для работы с объектами типа &amp;quot;транзакция&amp;quot; (&amp;quot;покупательская корзина&amp;quot;). Транзакция представляет собой множество товаров, приобретенных покупателем у поставщика. Каждому товару, который есть в наличии у поставщика, в транзакции соответствует отдельный признак, который принимает значение &#039;&#039;&#039;true&#039;&#039;&#039;, если товар присутствует в транзакции, и &#039;&#039;&#039;false&#039;&#039;&#039;, если товар в транзакции отсутствует.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся транзакций &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть две транзакции &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства &amp;lt;math&amp;gt;neighbour(p_1,p_2)&amp;lt;/math&amp;gt; этих транзакций больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства &amp;lt;math&amp;gt;sim(p_1,p_2)&amp;lt;/math&amp;gt;. В ней &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; &amp;lt;math&amp;gt;link(p_1,p_2)&amp;lt;/math&amp;gt; между двумя транзакциями &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; будем называть количество общих соседей этих транзакций.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика &amp;lt;math&amp;gt;goodness(C_i,C_j)&amp;lt;/math&amp;gt; достигает максимального значения среди всех пар кластеров. На начальном этапе каждая транзакция считается отдельным кластером.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
f(\theta)=\frac {1-\theta}{1+\theta}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\theta)}}&lt;br /&gt;
&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;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних транзакций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми транзакциями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждой транзакции значительно меньше общего количества транзакций, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей транзакции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет такую же вычислительную сложность, как и предыдущий шаг.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма можно оценить, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt;&lt;br /&gt;
или&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Информационный граф перемножения плотных матриц с подробным описанием представлен в статье [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ниже представлен информационный граф наиболее интересного для рассмотрения этапа алгоритма устойчивой кластеризации с использованием связей - тела цикла (полупрозрачным показана следующая итерация цикла) при &amp;lt;math&amp;gt;n=5&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:Rock-graph.png|thumb|center|1000px|Рисунок 1. Граф тела цикла; merge - объединение кластеров, insert - вставка goodness с новым кластером в упорядоченные списки соответствующих кластеров.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; высота ЯПФ равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, а внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга. Следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а высота ЯПФ равна &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи линейно, а ширина ЯПФ - квадратично.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; транзакциях, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов транзакции имеет значение &amp;quot;1&amp;quot;, каждую транзакцию можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с иcпользованием связей реализован в пакете 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;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=13879</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=13879"/>
		<updated>2016-10-26T08:39:12Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо множества) и другими. Множество значений, которые может принимать признак, называется доменом этого признака. Так, например, у объекта &#039;&#039;&#039;кошка&#039;&#039;&#039; может быть категорийный признак &#039;&#039;&#039;порода&#039;&#039;&#039;, доменом которого является множество &#039;&#039;&#039;[персидская, бенгальская, сфинкс, мейн-кун, ...]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с категорийными признаками.&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с использованием связей предназначен для работы с объектами типа &amp;quot;транзакция&amp;quot; (&amp;quot;покупательская корзина&amp;quot;). Транзакция представляет собой множество товаров, приобретенных покупателем у поставщика. Каждому товару, который есть в наличии у поставщика, в транзакции соответствует отдельный признак, который принимает значение &#039;&#039;&#039;true&#039;&#039;&#039;, если товар присутствует в транзакции, и &#039;&#039;&#039;false&#039;&#039;&#039;, если товар в транзакции отсутствует.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся транзакций &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть две транзакции &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства &amp;lt;math&amp;gt;neighbour(p_1,p_2)&amp;lt;/math&amp;gt; этих транзакций больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства &amp;lt;math&amp;gt;sim(p_1,p_2)&amp;lt;/math&amp;gt;. В ней &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; &amp;lt;math&amp;gt;link(p_1,p_2)&amp;lt;/math&amp;gt; между двумя транзакциями &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; будем называть количество общих соседей этих транзакций.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика &amp;lt;math&amp;gt;goodness(C_i,C_j)&amp;lt;/math&amp;gt; достигает максимального значения среди всех пар кластеров. На начальном этапе каждая транзакция считается отдельным кластером.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
f(\theta)=\frac {1-\theta}{1+\theta}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\theta)}}&lt;br /&gt;
&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;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних транзакций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми транзакциями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждой транзакции значительно меньше общего количества транзакций, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей транзакции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет такую же вычислительную сложность, как и предыдущий шаг.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма можно оценить, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt;&lt;br /&gt;
или&lt;br /&gt;
&amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Информационный граф перемножения плотных матриц с подробным описанием представлен в статье [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ниже представлен информационный граф наиболее интересного для рассмотрения этапа алгоритма устойчивой кластеризации с использованием связей - тела цикла (полупрозрачным показана следующая итерация цикла) при &amp;lt;math&amp;gt;n=5&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:Rock-graph.png|thumb|center|1000px|Рисунок 1. Граф тела цикла; merge - объединение кластеров, insert - вставка goodness с новым кластером в упорядоченные списки соответствующих кластеров.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; высота ЯПФ равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, а внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга. Следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а высота ЯПФ равна &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи линейно, а ширина ЯПФ - квадратично.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; транзакциях, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов транзакции имеет значение &amp;quot;1&amp;quot;, каждую транзакцию можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с иcпользованием связей реализован в пакете 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;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=13865</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=13865"/>
		<updated>2016-10-26T08:23:41Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо множества) и другими. Множество значений, которые может принимать признак, называется доменом этого признака. Так, например, у объекта &#039;&#039;&#039;кошка&#039;&#039;&#039; может быть категорийный признак &#039;&#039;&#039;порода&#039;&#039;&#039;, доменом которого является множество &#039;&#039;&#039;[персидская, бенгальская, сфинкс, мейн-кун, ...]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с категорийными признаками.&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с использованием связей предназначен для работы с объектами типа &amp;quot;транзакция&amp;quot; (&amp;quot;покупательская корзина&amp;quot;). Транзакция представляет собой множество товаров, приобретенных покупателем у поставщика. Каждому товару, который есть в наличии у поставщика, в транзакции соответствует отдельный признак, который принимает значение &#039;&#039;&#039;true&#039;&#039;&#039;, если товар присутствует в транзакции, и &#039;&#039;&#039;false&#039;&#039;&#039;, если товар в транзакции отсутствует.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся транзакций &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть две транзакции &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства &amp;lt;math&amp;gt;neighbour(p_1,p_2)&amp;lt;/math&amp;gt; этих транзакций больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства &amp;lt;math&amp;gt;sim(p_1,p_2)&amp;lt;/math&amp;gt;. В ней &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; &amp;lt;math&amp;gt;link(p_1,p_2)&amp;lt;/math&amp;gt; между двумя транзакциями &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; будем называть количество общих соседей этих транзакций.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика &amp;lt;math&amp;gt;goodness(C_i,C_j)&amp;lt;/math&amp;gt; достигает максимального значения среди всех пар кластеров. На начальном этапе каждая транзакция считается отдельным кластером.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
f(\theta)=\frac {1-\theta}{1+\theta}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\theta)}}&lt;br /&gt;
&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;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних транзакций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми транзакциями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждой транзакции значительно меньше общего количества транзакций, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей транзакции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет такую же вычислительную сложность, как и предыдущий шаг.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма можно оценить, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Информационный граф перемножения плотных матриц с подробным описанием представлен в статье [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ниже представлен информационный граф наиболее интересного для рассмотрения этапа алгоритма устойчивой кластеризации с использованием связей - тела цикла (полупрозрачным показана следующая итерация цикла) при &amp;lt;math&amp;gt;n=5&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:Rock-graph.png|thumb|center|1000px|Рисунок 1. Граф тела цикла; merge - объединение кластеров, insert - вставка goodness с новым кластером в упорядоченные списки соответствующих кластеров.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; высота ЯПФ равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, а внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга. Следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а высота ЯПФ равна &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи линейно, а ширина ЯПФ - квадратично.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; транзакциях, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов транзакции имеет значение &amp;quot;1&amp;quot;, каждую транзакцию можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с иcпользованием связей реализован в пакете 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;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=13863</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=13863"/>
		<updated>2016-10-26T08:10:43Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо множества) и другими. Множество значений, которые может принимать признак, называется доменом этого признака. Так, например, у объекта &#039;&#039;&#039;кошка&#039;&#039;&#039; может быть категорийный признак &#039;&#039;&#039;порода&#039;&#039;&#039;, доменом которого является множество &#039;&#039;&#039;[персидская, бенгальская, сфинкс, мейн-кун, ...]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с категорийными признаками.&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с использованием связей предназначен для работы с объектами типа &amp;quot;транзакция&amp;quot; (&amp;quot;покупательская корзина&amp;quot;). Транзакция представляет собой множество товаров, приобретенных покупателем у поставщика. Каждому товару, который есть в наличии у поставщика, в транзакции соответствует отдельный признак, который принимает значение &#039;&#039;&#039;true&#039;&#039;&#039;, если товар присутствует в транзакции, и &#039;&#039;&#039;false&#039;&#039;&#039;, если товар в транзакции отсутствует.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся транзакций &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть две транзакции &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства &amp;lt;math&amp;gt;neighbour(p_1,p_2)&amp;lt;/math&amp;gt; этих транзакций больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства &amp;lt;math&amp;gt;sim(p_1,p_2)&amp;lt;/math&amp;gt;. В ней &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; &amp;lt;math&amp;gt;link(p_1,p_2)&amp;lt;/math&amp;gt; между двумя транзакциями &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; будем называть количество общих соседей этих транзакций.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика &amp;lt;math&amp;gt;goodness(C_i,C_j)&amp;lt;/math&amp;gt; достигает максимального значения среди всех пар кластеров. На начальном этапе каждая транзакция считается отдельным кластером.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta), \\&lt;br /&gt;
sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}, \\&lt;br /&gt;
link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big), \\&lt;br /&gt;
E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}, \\&lt;br /&gt;
f(\theta)=\frac {1-\theta}{1+\theta}, \\&lt;br /&gt;
goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\theta)}}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&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;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних транзакций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми транзакциями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждой транзакции значительно меньше общего количества транзакций, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей транзакции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет такую же вычислительную сложность, как и предыдущий шаг.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма можно оценить, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Информационный граф перемножения плотных матриц с подробным описанием представлен в статье [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ниже представлен информационный граф наиболее интересного для рассмотрения этапа алгоритма устойчивой кластеризации с использованием связей - тела цикла (полупрозрачным показана следующая итерация цикла) при &amp;lt;math&amp;gt;n=5&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:Rock-graph.png|thumb|center|1000px|Рисунок 1. Граф тела цикла; merge - объединение кластеров, insert - вставка goodness с новым кластером в упорядоченные списки соответствующих кластеров.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; высота ЯПФ равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, а внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга. Следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а высота ЯПФ равна &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи линейно, а ширина ЯПФ - квадратично.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; транзакциях, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов транзакции имеет значение &amp;quot;1&amp;quot;, каждую транзакцию можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с иcпользованием связей реализован в пакете 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;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=13859</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=13859"/>
		<updated>2016-10-26T08:00:16Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо множества) и другими. Множество значений, которые может принимать признак, называется доменом этого признака. Так, например, у объекта &#039;&#039;&#039;кошка&#039;&#039;&#039; может быть категорийный признак &#039;&#039;&#039;порода&#039;&#039;&#039;, доменом которого является множество &#039;&#039;&#039;[персидская, бенгальская, сфинкс, мейн-кун, ...]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с категорийными признаками.&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с использованием связей предназначен для работы с объектами типа &amp;quot;транзакция&amp;quot; (&amp;quot;покупательская корзина&amp;quot;). Транзакция представляет собой множество товаров, приобретенных покупателем у поставщика. Каждому товару, который есть в наличии у поставщика, в транзакции соответствует отдельный признак, который принимает значение &#039;&#039;&#039;true&#039;&#039;&#039;, если товар присутствует в транзакции, и &#039;&#039;&#039;false&#039;&#039;&#039;, если товар в транзакции отсутствует.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся транзакций &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть две транзакции &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства этих транзакций больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;, то есть&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; между двумя транзакциями будем называть количество общих соседей этих транзакций, то есть&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве критериальной функции используется функция вида&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера. Функция &amp;lt;math&amp;gt;f(\theta)&amp;lt;/math&amp;gt; имеет вид&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;f(\theta)=\frac {1-\theta}{1+\theta}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\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;
# Вычисление количества связей между каждой парой транзакций (&amp;lt;math&amp;gt;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних транзакций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми транзакциями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждой транзакции значительно меньше общего количества транзакций, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей транзакции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет такую же вычислительную сложность, как и предыдущий шаг.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма можно оценить, как&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Информационный граф перемножения плотных матриц с подробным описанием представлен в статье [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ниже представлен информационный граф наиболее интересного для рассмотрения этапа алгоритма устойчивой кластеризации с использованием связей - тела цикла (полупрозрачным показана следующая итерация цикла) при &amp;lt;math&amp;gt;n=5&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:Rock-graph.png|thumb|center|1000px|Рисунок 1. Граф тела цикла; merge - объединение кластеров, insert - вставка goodness с новым кластером в упорядоченные списки соответствующих кластеров.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; высота ЯПФ равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, а внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга. Следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а высота ЯПФ равна &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи линейно, а ширина ЯПФ - квадратично.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; транзакциях, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов транзакции имеет значение &amp;quot;1&amp;quot;, каждую транзакцию можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с иcпользованием связей реализован в пакете 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;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=13858</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=13858"/>
		<updated>2016-10-26T07:59:40Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо множества) и другими. Множество значений, которые может принимать признак, называется доменом этого признака. Так, например, у объекта &#039;&#039;&#039;кошка&#039;&#039;&#039; может быть категорийный признак &#039;&#039;&#039;порода&#039;&#039;&#039;, доменом которого является множество &#039;&#039;&#039;[персидская, бенгальская, сфинкс, мейн-кун, ...]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с категорийными признаками.&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с использованием связей предназначен для работы с объектами типа &amp;quot;транзакция&amp;quot; (&amp;quot;покупательская корзина&amp;quot;). Транзакция представляет собой множество товаров, приобретенных покупателем у поставщика. Каждому товару, который есть в наличии у поставщика, в транзакции соответствует отдельный признак, который принимает значение &#039;&#039;&#039;true&#039;&#039;&#039;, если товар присутствует в транзакции, и &#039;&#039;&#039;false&#039;&#039;&#039;, если товар в транзакции отсутствует.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся транзакций &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть две транзакции &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства этих транзакций больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;, то есть&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; между двумя транзакциями будем называть количество общих соседей этих транзакций, то есть&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве критериальной функции используется функция вида&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера. Функция &amp;lt;math&amp;gt;f(\theta)&amp;lt;/math&amp;gt; имеет вид&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;f(\theta)=\frac {1-\theta}{1+\theta}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\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;
# Вычисление количества связей между каждой парой транзакций (&amp;lt;math&amp;gt;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних транзакций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми транзакциями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждой транзакции значительно меньше общего количества транзакций, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей транзакции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет такую же вычислительную сложность, как и предыдущий шаг.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма можно оценить, как &amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Информационный граф перемножения плотных матриц с подробным описанием представлен в статье [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ниже представлен информационный граф наиболее интересного для рассмотрения этапа алгоритма устойчивой кластеризации с использованием связей - тела цикла (полупрозрачным показана следующая итерация цикла) при &amp;lt;math&amp;gt;n=5&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:Rock-graph.png|thumb|center|1000px|Рисунок 1. Граф тела цикла; merge - объединение кластеров, insert - вставка goodness с новым кластером в упорядоченные списки соответствующих кластеров.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; высота ЯПФ равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, а внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга. Следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а высота ЯПФ равна &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи линейно, а ширина ЯПФ - квадратично.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; транзакциях, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов транзакции имеет значение &amp;quot;1&amp;quot;, каждую транзакцию можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с иcпользованием связей реализован в пакете 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;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=13856</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=13856"/>
		<updated>2016-10-26T07:58:29Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо множества) и другими. Множество значений, которые может принимать признак, называется доменом этого признака. Так, например, у объекта &#039;&#039;&#039;кошка&#039;&#039;&#039; может быть категорийный признак &#039;&#039;&#039;порода&#039;&#039;&#039;, доменом которого является множество &#039;&#039;&#039;[персидская, бенгальская, сфинкс, мейн-кун, ...]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с категорийными признаками.&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с использованием связей предназначен для работы с объектами типа &amp;quot;транзакция&amp;quot; (&amp;quot;покупательская корзина&amp;quot;). Транзакция представляет собой множество товаров, приобретенных покупателем у поставщика. Каждому товару, который есть в наличии у поставщика, в транзакции соответствует отдельный признак, который принимает значение &#039;&#039;&#039;true&#039;&#039;&#039;, если товар присутствует в транзакции, и &#039;&#039;&#039;false&#039;&#039;&#039;, если товар в транзакции отсутствует.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся транзакций &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть две транзакции &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства этих транзакций больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; между двумя транзакциями будем называть количество общих соседей этих транзакций, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве критериальной функции используется функция вида&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера. Функция &amp;lt;math&amp;gt;f(\theta)&amp;lt;/math&amp;gt; имеет вид&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(\theta)=\frac {1-\theta}{1+\theta}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\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;
# Вычисление количества связей между каждой парой транзакций (&amp;lt;math&amp;gt;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних транзакций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми транзакциями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждой транзакции значительно меньше общего количества транзакций, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей транзакции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет такую же вычислительную сложность, как и предыдущий шаг.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма можно оценить, как &amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Информационный граф перемножения плотных матриц с подробным описанием представлен в статье [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ниже представлен информационный граф наиболее интересного для рассмотрения этапа алгоритма устойчивой кластеризации с использованием связей - тела цикла (полупрозрачным показана следующая итерация цикла) при &amp;lt;math&amp;gt;n=5&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:Rock-graph.png|thumb|center|1000px|Рисунок 1. Граф тела цикла; merge - объединение кластеров, insert - вставка goodness с новым кластером в упорядоченные списки соответствующих кластеров.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; высота ЯПФ равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, а внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга. Следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а высота ЯПФ равна &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи линейно, а ширина ЯПФ - квадратично.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; транзакциях, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов транзакции имеет значение &amp;quot;1&amp;quot;, каждую транзакцию можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с иcпользованием связей реализован в пакете 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;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=13855</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=13855"/>
		<updated>2016-10-26T07:53:47Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо множества) и другими. Множество значений, которые может принимать признак, называется доменом этого признака. Так, например, у объекта &#039;&#039;&#039;кошка&#039;&#039;&#039; может быть категорийный признак &#039;&#039;&#039;порода&#039;&#039;&#039;, доменом которого является множество &#039;&#039;&#039;[персидская, бенгальская, сфинкс, мейн-кун, ...]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с категорийными признаками.&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с использованием связей предназначен для работы с объектами типа &amp;quot;транзакция&amp;quot; (&amp;quot;покупательская корзина&amp;quot;). Транзакция представляет собой множество товаров, приобретенных покупателем у поставщика. Каждому товару, который есть в наличии у поставщика, в транзакции соответствует отдельный признак, который принимает значение &#039;&#039;&#039;true&#039;&#039;&#039;, если товар присутствует в транзакции, и &#039;&#039;&#039;false&#039;&#039;&#039;, если товар в транзакции отсутствует.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся транзакций &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть две транзакции &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства этих транзакций больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; между двумя транзакциями будем называть количество общих соседей этих транзакций, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве критериальной функции используется функция вида&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера. Функция &amp;lt;math&amp;gt;f(\theta)&amp;lt;/math&amp;gt; имеет вид&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(\theta)=\frac {1-\theta}{1+\theta}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\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;
# Вычисление количества связей между каждой парой транзакций (&amp;lt;math&amp;gt;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних транзакций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми транзакциями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждой транзакции значительно меньше общего количества транзакций, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей транзакции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет такую же вычислительную сложность, как и предыдущий шаг.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма можно оценить, как &amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Информационный граф перемножения плотных матриц с подробным описанием представлен в статье [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ниже представлен информационный граф наиболее интересного этапа алгоритма устойчивой кластеризации с использованием связей - тела цикла (полупрозрачным показана следующая итерация цикла).&lt;br /&gt;
&lt;br /&gt;
[[file:Rock-graph.png|thumb|center|1000px|Рисунок 1. Граф тела цикла; merge - объединение кластеров, insert - вставка goodness с новым кластером в упорядоченные списки соответствующих кластеров.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; высота ЯПФ равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, а внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга. Следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а высота ЯПФ равна &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи линейно, а ширина ЯПФ - квадратично.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; транзакциях, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов транзакции имеет значение &amp;quot;1&amp;quot;, каждую транзакцию можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с иcпользованием связей реализован в пакете 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;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=13852</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=13852"/>
		<updated>2016-10-26T07:49:08Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо множества) и другими. Множество значений, которые может принимать признак, называется доменом этого признака. Так, например, у объекта &#039;&#039;&#039;кошка&#039;&#039;&#039; может быть категорийный признак &#039;&#039;&#039;порода&#039;&#039;&#039;, доменом которого является множество &#039;&#039;&#039;[персидская, бенгальская, сфинкс, мейн-кун, ...]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с категорийными признаками.&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с использованием связей предназначен для работы с объектами типа &amp;quot;транзакция&amp;quot; (&amp;quot;покупательская корзина&amp;quot;). Транзакция представляет собой множество товаров, приобретенных покупателем у поставщика. Каждому товару, который есть в наличии у поставщика, в транзакции соответствует отдельный признак, который принимает значение &#039;&#039;&#039;true&#039;&#039;&#039;, если товар присутствует в транзакции, и &#039;&#039;&#039;false&#039;&#039;&#039;, если товар в транзакции отсутствует.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся транзакций &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть две транзакции &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства этих транзакций больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; между двумя транзакциями будем называть количество общих соседей этих транзакций, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве критериальной функции используется функция вида&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера. Функция &amp;lt;math&amp;gt;f(\theta)&amp;lt;/math&amp;gt; имеет вид&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(\theta)=\frac {1-\theta}{1+\theta}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\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;
# Вычисление количества связей между каждой парой транзакций (&amp;lt;math&amp;gt;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних транзакций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми транзакциями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждой транзакции значительно меньше общего количества транзакций, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей транзакции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет такую же вычислительную сложность, как и предыдущий шаг.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма можно оценить, как &amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Информационный граф перемножения плотных матриц с подробным описанием представлен в статье [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ниже представлен информационный граф наиболее интересного этапа алгоритма устойчивой кластеризации с использованием связей - тела цикла (полупрозрачным показана следующая итерация цикла).&lt;br /&gt;
&lt;br /&gt;
[[file:Rock-graph.png|thumb|center|1000px|Рисунок 1. Граф тела цикла; merge - объединение кластеров, insert - вставка goodness с новым кластером в упорядоченные списки соответствующих кластеров.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; высота ЯПФ равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, а внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга. Следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а высота ЯПФ равна &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи линейно, а ширина ЯПФ - квадратично.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; транзакциях, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов транзакции имеет значение &amp;quot;1&amp;quot;, каждую транзакцию можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с иcпользованием связей реализован в пакете 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;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev&amp;diff=13808</id>
		<title>Участник:Viktorrulev</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:Viktorrulev&amp;diff=13808"/>
		<updated>2016-10-25T21:35:06Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Рулев Виктор Антонович&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
620 группа&lt;br /&gt;
&lt;br /&gt;
[[Участник:Viktorrulev/Алгоритм_устойчивой_кластеризации_с_иcпользованием_связей|Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)]]&lt;br /&gt;
&lt;br /&gt;
e-mail: viktorrulev@yandex.ru&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=12510</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=12510"/>
		<updated>2016-10-16T12:58:05Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо множества) и другими. Множество значений, которые может принимать признак, называется доменом этого признака. Так, например, у объекта &#039;&#039;&#039;кошка&#039;&#039;&#039; может быть категорийный признак &#039;&#039;&#039;порода&#039;&#039;&#039;, доменом которого является множество &#039;&#039;&#039;[персидская, бенгальская, сфинкс, мейн-кун, ...]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с категорийными признаками.&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с использованием связей предназначен для работы с объектами типа &amp;quot;транзакция&amp;quot; (&amp;quot;покупательская корзина&amp;quot;). Транзакция представляет собой множество товаров, приобретенных покупателем у поставщика. Каждому товару, который есть в наличии у поставщика, в транзакции соответствует отдельный признак, который принимает значение &#039;&#039;&#039;true&#039;&#039;&#039;, если товар присутствует в транзакции, и &#039;&#039;&#039;false&#039;&#039;&#039;, если товар в транзакции отсутствует.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся транзакций &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть две транзакции &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства этих транзакций больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; между двумя транзакциями будем называть количество общих соседей этих транзакций, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве критериальной функции используется функция вида&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера. Функция &amp;lt;math&amp;gt;f(\theta)&amp;lt;/math&amp;gt; имеет вид&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(\theta)=\frac {1-\theta}{1+\theta}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\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;
# Вычисление количества связей между каждой парой транзакций (&amp;lt;math&amp;gt;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних транзакций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми транзакциями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждой транзакции значительно меньше общего количества транзакций, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей транзакции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет такую же вычислительную сложность, как и предыдущий шаг.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма можно оценить, как &amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Информационный граф перемножения плотных матриц с подробным описанием представлен в статье [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ниже представлен информационный граф наиболее интересного этапа алгоритма устойчивой кластеризации с использованием связей - тела цикла (полупрозрачным показана следующая итерация цикла).&lt;br /&gt;
&lt;br /&gt;
[[file:Rock-graph.png|thumb|center|1000px|Рисунок 1. Граф тела цикла; merge - объединение кластеров, insert - вставка goodness с новым кластером в упорядоченные списки соответствующих кластеров.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; высота ЯПФ равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, а внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга. Следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а высота ЯПФ равна &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи линейно, а ширина ЯПФ - квадратично.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; транзакциях, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов транзакции имеет значение &amp;quot;1&amp;quot;, каждую транзакцию можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с иcпользованием связей реализован в пакете CBA языка R.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Rock-graph.png&amp;diff=12509</id>
		<title>Файл:Rock-graph.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Rock-graph.png&amp;diff=12509"/>
		<updated>2016-10-16T12:57:03Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: Viktorrulev загрузил новую версию Файл:Rock-graph.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=12506</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=12506"/>
		<updated>2016-10-16T12:51:26Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо множества) и другими. Множество значений, которые может принимать признак, называется доменом этого признака. Так, например, у объекта &#039;&#039;&#039;кошка&#039;&#039;&#039; может быть категорийный признак &#039;&#039;&#039;порода&#039;&#039;&#039;, доменом которого является множество &#039;&#039;&#039;[персидская, бенгальская, сфинкс, мейн-кун, ...]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с категорийными признаками.&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с использованием связей предназначен для работы с объектами типа &amp;quot;транзакция&amp;quot; (&amp;quot;покупательская корзина&amp;quot;). Транзакция представляет собой множество товаров, приобретенных покупателем у поставщика. Каждому товару, который есть в наличии у поставщика, в транзакции соответствует отдельный признак, который принимает значение &#039;&#039;&#039;true&#039;&#039;&#039;, если товар присутствует в транзакции, и &#039;&#039;&#039;false&#039;&#039;&#039;, если товар в транзакции отсутствует.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся транзакций &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть две транзакции &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства этих транзакций больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; между двумя транзакциями будем называть количество общих соседей этих транзакций, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве критериальной функции используется функция вида&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера. Функция &amp;lt;math&amp;gt;f(\theta)&amp;lt;/math&amp;gt; имеет вид&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(\theta)=\frac {1-\theta}{1+\theta}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\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;
# Вычисление количества связей между каждой парой транзакций (&amp;lt;math&amp;gt;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних транзакций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми транзакциями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждой транзакции значительно меньше общего количества транзакций, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей транзакции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет такую же вычислительную сложность, как и предыдущий шаг.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма можно оценить, как &amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Информационный граф перемножения матриц с подробным описанием представлен в статье [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ниже представлен информационный граф наиболее интересного этапа алгоритма устойчивой кластеризации с использованием связей - тела цикла (полупрозрачным показана следующая итерация цикла).&lt;br /&gt;
&lt;br /&gt;
[[file:Rock-graph.png|thumb|center|1000px|Рисунок 1. Граф тела цикла; merge - объединение кластеров, insert - вставка goodness с новым кластером в упорядоченные списки соответствующих кластеров.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; высота ЯПФ равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, а внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга. Следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а высота ЯПФ равна &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи линейно, а ширина ЯПФ - квадратично.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; транзакциях, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов транзакции имеет значение &amp;quot;1&amp;quot;, каждую транзакцию можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с иcпользованием связей реализован в пакете CBA языка R.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=12411</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=12411"/>
		<updated>2016-10-16T01:06:36Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&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(M)&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо множества) и другими. Множество значений, которые может принимать признак, называется доменом этого признака. Так, например, у объекта &#039;&#039;&#039;кошка&#039;&#039;&#039; может быть категорийный признак &#039;&#039;&#039;порода&#039;&#039;&#039;, доменом которого является множество &#039;&#039;&#039;[персидская, бенгальская, сфинкс, мейн-кун, ...]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с категорийными признаками.&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с использованием связей предназначен для работы с объектами типа &amp;quot;транзакция&amp;quot; (&amp;quot;покупательская корзина&amp;quot;). Транзакция представляет собой множество товаров, приобретенных покупателем у поставщика. Каждому товару, который есть в наличии у поставщика, в транзакции соответствует отдельный признак, который принимает значение &#039;&#039;&#039;true&#039;&#039;&#039;, если товар присутствует в транзакции, и &#039;&#039;&#039;false&#039;&#039;&#039;, если товар в транзакции отсутствует.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся транзакций &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть две транзакции &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства этих транзакций больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; между двумя транзакциями будем называть количество общих соседей этих транзакций, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве критериальной функции используется функция вида&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера. Функция &amp;lt;math&amp;gt;f(\theta)&amp;lt;/math&amp;gt; имеет вид&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(\theta)=\frac {1-\theta}{1+\theta}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\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;
# Вычисление количества связей между каждой парой транзакций (&amp;lt;math&amp;gt;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних транзакций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми транзакциями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждой транзакции значительно меньше общего количества транзакций, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей транзакции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет такую же вычислительную сложность, как и предыдущий шаг.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма можно оценить, как &amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Информационный граф перемножения матриц с подробным описанием представлен в статье [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ниже представлен информационный граф наиболее интересного этапа алгоритма устойчивой кластеризации с использованием связей - тела цикла (полупрозрачным показана следующая итерация цикла).&lt;br /&gt;
&lt;br /&gt;
[[file:Rock-graph.png|thumb|center|1000px|Рисунок 1. Граф тела цикла; merge - объединение кластеров, insert - вставка goodness с новым кластером в упорядоченные списки соответствующих кластеров.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; высота ЯПФ равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, следовательно высота ЯПФ равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;. Внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга, следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;O(logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи линейно, а ширина ЯПФ - квадратично.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; транзакциях, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов транзакции имеет значение &amp;quot;1&amp;quot;, каждую транзакцию можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с иcпользованием связей реализован в пакете CBA языка R.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=12410</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=12410"/>
		<updated>2016-10-16T01:04:56Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: /* Ресурс параллелизма алгоритма */&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(M)&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо множества) и другими. Множество значений, которые может принимать признак, называется доменом этого признака. Так, например, у объекта &#039;&#039;&#039;кошка&#039;&#039;&#039; может быть категорийный признак &#039;&#039;&#039;порода&#039;&#039;&#039;, доменом которого является множество &#039;&#039;&#039;[персидская, бенгальская, сфинкс, мейн-кун, ...]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с категорийными признаками.&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с использованием связей предназначен для работы с объектами типа &amp;quot;транзакция&amp;quot; (&amp;quot;покупательская корзина&amp;quot;). Транзакция представляет собой множество товаров, приобретенных покупателем у поставщика. Каждому товару, который есть в наличии у поставщика, в транзакции соответствует отдельный признак, который принимает значение &#039;&#039;&#039;true&#039;&#039;&#039;, если товар присутствует в транзакции, и &#039;&#039;&#039;false&#039;&#039;&#039;, если товар в транзакции отсутствует.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся транзакций &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть две транзакции &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства этих транзакций больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; между двумя транзакциями будем называть количество общих соседей этих транзакций, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве критериальной функции используется функция вида&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера. Функция &amp;lt;math&amp;gt;f(\theta)&amp;lt;/math&amp;gt; имеет вид&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(\theta)=\frac {1-\theta}{1+\theta}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\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;
# Вычисление количества связей между каждой парой транзакций (&amp;lt;math&amp;gt;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних транзакций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми транзакциями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждой транзакции значительно меньше общего количества транзакций, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей транзакции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет такую же вычислительную сложность, как и предыдущий шаг.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма можно оценить, как &amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Информационный граф перемножения матриц с подробным описанием представлен в статье [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ниже представлен информационный граф наиболее интересного этапа алгоритма устойчивой кластеризации с использованием связей - тела цикла (полупрозрачным показана следующая итерация цикла).&lt;br /&gt;
&lt;br /&gt;
[[file:Rock-graph.png|thumb|center|1000px|Рисунок 1. Граф тела цикла; merge - объединение кластеров, insert - вставка goodness с новым кластером в упорядоченные списки соответствующих кластеров.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; высота ЯПФ равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, следовательно высота ЯПФ равна &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;. Внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга, следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;O(logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи линейно, а ширина ЯПФ - квадратично.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; транзакциях, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов транзакции имеет значение &amp;quot;1&amp;quot;, каждую транзакцию можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с иcпользованием связей реализован в пакете CBA языка R.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=12409</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=12409"/>
		<updated>2016-10-16T01:03:14Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: /* Информационный граф */&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(M)&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо множества) и другими. Множество значений, которые может принимать признак, называется доменом этого признака. Так, например, у объекта &#039;&#039;&#039;кошка&#039;&#039;&#039; может быть категорийный признак &#039;&#039;&#039;порода&#039;&#039;&#039;, доменом которого является множество &#039;&#039;&#039;[персидская, бенгальская, сфинкс, мейн-кун, ...]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с категорийными признаками.&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с использованием связей предназначен для работы с объектами типа &amp;quot;транзакция&amp;quot; (&amp;quot;покупательская корзина&amp;quot;). Транзакция представляет собой множество товаров, приобретенных покупателем у поставщика. Каждому товару, который есть в наличии у поставщика, в транзакции соответствует отдельный признак, который принимает значение &#039;&#039;&#039;true&#039;&#039;&#039;, если товар присутствует в транзакции, и &#039;&#039;&#039;false&#039;&#039;&#039;, если товар в транзакции отсутствует.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся транзакций &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть две транзакции &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства этих транзакций больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; между двумя транзакциями будем называть количество общих соседей этих транзакций, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве критериальной функции используется функция вида&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера. Функция &amp;lt;math&amp;gt;f(\theta)&amp;lt;/math&amp;gt; имеет вид&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(\theta)=\frac {1-\theta}{1+\theta}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\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;
# Вычисление количества связей между каждой парой транзакций (&amp;lt;math&amp;gt;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних транзакций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми транзакциями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждой транзакции значительно меньше общего количества транзакций, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей транзакции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет такую же вычислительную сложность, как и предыдущий шаг.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма можно оценить, как &amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Информационный граф перемножения матриц с подробным описанием представлен в статье [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ниже представлен информационный граф наиболее интересного этапа алгоритма устойчивой кластеризации с использованием связей - тела цикла (полупрозрачным показана следующая итерация цикла).&lt;br /&gt;
&lt;br /&gt;
[[file:Rock-graph.png|thumb|center|1000px|Рисунок 1. Граф тела цикла; merge - объединение кластеров, insert - вставка goodness с новым кластером в упорядоченные списки соответствующих кластеров.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;M \times M&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; высота ЯПФ равна &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;M^2&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, следовательно высота ЯПФ равна &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;. Внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга, следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;logM&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи линейно, а ширина ЯПФ - квадратично.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; транзакциях, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов транзакции имеет значение &amp;quot;1&amp;quot;, каждую транзакцию можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с иcпользованием связей реализован в пакете CBA языка R.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Rock-graph.png&amp;diff=12405</id>
		<title>Файл:Rock-graph.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Rock-graph.png&amp;diff=12405"/>
		<updated>2016-10-16T01:00:44Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=12304</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=12304"/>
		<updated>2016-10-15T23:04:32Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: /* Последовательная сложность алгоритма */&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(M)&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо множества) и другими. Множество значений, которые может принимать признак, называется доменом этого признака. Так, например, у объекта &#039;&#039;&#039;кошка&#039;&#039;&#039; может быть категорийный признак &#039;&#039;&#039;порода&#039;&#039;&#039;, доменом которого является множество &#039;&#039;&#039;[персидская, бенгальская, сфинкс, мейн-кун, ...]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с категорийными признаками.&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с использованием связей предназначен для работы с объектами типа &amp;quot;транзакция&amp;quot; (&amp;quot;покупательская корзина&amp;quot;). Транзакция представляет собой множество товаров, приобретенных покупателем у поставщика. Каждому товару, который есть в наличии у поставщика, в транзакции соответствует отдельный признак, который принимает значение &#039;&#039;&#039;true&#039;&#039;&#039;, если товар присутствует в транзакции, и &#039;&#039;&#039;false&#039;&#039;&#039;, если товар в транзакции отсутствует.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся транзакций &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть две транзакции &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства этих транзакций больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; между двумя транзакциями будем называть количество общих соседей этих транзакций, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве критериальной функции используется функция вида&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера. Функция &amp;lt;math&amp;gt;f(\theta)&amp;lt;/math&amp;gt; имеет вид&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(\theta)=\frac {1-\theta}{1+\theta}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\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;
# Вычисление количества связей между каждой парой транзакций (&amp;lt;math&amp;gt;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних транзакций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми транзакциями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждой транзакции значительно меньше общего количества транзакций, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей транзакции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет такую же вычислительную сложность, как и предыдущий шаг.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма можно оценить, как &amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
(to do)&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;M \times M&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; высота ЯПФ равна &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;M^2&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, следовательно высота ЯПФ равна &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;. Внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга, следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;logM&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи линейно, а ширина ЯПФ - квадратично.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; транзакциях, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов транзакции имеет значение &amp;quot;1&amp;quot;, каждую транзакцию можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с иcпользованием связей реализован в пакете CBA языка R.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=12278</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=12278"/>
		<updated>2016-10-15T22:44:58Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: /* Программная реализация алгоритма */&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(M)&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо множества) и другими. Множество значений, которые может принимать признак, называется доменом этого признака. Так, например, у объекта &#039;&#039;&#039;кошка&#039;&#039;&#039; может быть категорийный признак &#039;&#039;&#039;порода&#039;&#039;&#039;, доменом которого является множество &#039;&#039;&#039;[персидская, бенгальская, сфинкс, мейн-кун, ...]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с категорийными признаками.&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с использованием связей предназначен для работы с объектами типа &amp;quot;транзакция&amp;quot; (&amp;quot;покупательская корзина&amp;quot;). Транзакция представляет собой множество товаров, приобретенных покупателем у поставщика. Каждому товару, который есть в наличии у поставщика, в транзакции соответствует отдельный признак, который принимает значение &#039;&#039;&#039;true&#039;&#039;&#039;, если товар присутствует в транзакции, и &#039;&#039;&#039;false&#039;&#039;&#039;, если товар в транзакции отсутствует.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся транзакций &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть две транзакции &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства этих транзакций больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; между двумя транзакциями будем называть количество общих соседей этих транзакций, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве критериальной функции используется функция вида&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера. Функция &amp;lt;math&amp;gt;f(\theta)&amp;lt;/math&amp;gt; имеет вид&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(\theta)=\frac {1-\theta}{1+\theta}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\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;
# Вычисление количества связей между каждой парой транзакций (&amp;lt;math&amp;gt;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних транзакций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми транзакциями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Алгоритм Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждой транзакции значительно меньше общего количества транзакций, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей транзакции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет такую же вычислительную сложность, как и предыдущий шаг.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма можно оценить, как &amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
(to do)&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;M \times M&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; высота ЯПФ равна &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;M^2&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, следовательно высота ЯПФ равна &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;. Внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга, следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;logM&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи линейно, а ширина ЯПФ - квадратично.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; транзакциях, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов транзакции имеет значение &amp;quot;1&amp;quot;, каждую транзакцию можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с иcпользованием связей реализован в пакете CBA языка R.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=12272</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=12272"/>
		<updated>2016-10-15T22:41:21Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: /* Программная реализация алгоритма */&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(M)&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо множества) и другими. Множество значений, которые может принимать признак, называется доменом этого признака. Так, например, у объекта &#039;&#039;&#039;кошка&#039;&#039;&#039; может быть категорийный признак &#039;&#039;&#039;порода&#039;&#039;&#039;, доменом которого является множество &#039;&#039;&#039;[персидская, бенгальская, сфинкс, мейн-кун, ...]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с категорийными признаками.&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с использованием связей предназначен для работы с объектами типа &amp;quot;транзакция&amp;quot; (&amp;quot;покупательская корзина&amp;quot;). Транзакция представляет собой множество товаров, приобретенных покупателем у поставщика. Каждому товару, который есть в наличии у поставщика, в транзакции соответствует отдельный признак, который принимает значение &#039;&#039;&#039;true&#039;&#039;&#039;, если товар присутствует в транзакции, и &#039;&#039;&#039;false&#039;&#039;&#039;, если товар в транзакции отсутствует.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся транзакций &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть две транзакции &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства этих транзакций больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; между двумя транзакциями будем называть количество общих соседей этих транзакций, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве критериальной функции используется функция вида&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера. Функция &amp;lt;math&amp;gt;f(\theta)&amp;lt;/math&amp;gt; имеет вид&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(\theta)=\frac {1-\theta}{1+\theta}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\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;
# Вычисление количества связей между каждой парой транзакций (&amp;lt;math&amp;gt;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних транзакций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми транзакциями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Алгоритм Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждой транзакции значительно меньше общего количества транзакций, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей транзакции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет такую же вычислительную сложность, как и предыдущий шаг.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма можно оценить, как &amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
(to do)&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;M \times M&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; высота ЯПФ равна &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;M^2&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, следовательно высота ЯПФ равна &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;. Внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга, следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;logM&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи линейно, а ширина ЯПФ - квадратично.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; транзакциях, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов транзакции имеет значение &amp;quot;1&amp;quot;, каждую транзакцию можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&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;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с иcпользованием связей реализован в пакете CBA языка R.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=12269</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=12269"/>
		<updated>2016-10-15T22:33:59Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: &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(M)&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо множества) и другими. Множество значений, которые может принимать признак, называется доменом этого признака. Так, например, у объекта &#039;&#039;&#039;кошка&#039;&#039;&#039; может быть категорийный признак &#039;&#039;&#039;порода&#039;&#039;&#039;, доменом которого является множество &#039;&#039;&#039;[персидская, бенгальская, сфинкс, мейн-кун, ...]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с категорийными признаками.&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с использованием связей предназначен для работы с объектами типа &amp;quot;транзакция&amp;quot; (&amp;quot;покупательская корзина&amp;quot;). Транзакция представляет собой множество товаров, приобретенных покупателем у поставщика. Каждому товару, который есть в наличии у поставщика, в транзакции соответствует отдельный признак, который принимает значение &#039;&#039;&#039;true&#039;&#039;&#039;, если товар присутствует в транзакции, и &#039;&#039;&#039;false&#039;&#039;&#039;, если товар в транзакции отсутствует.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся транзакций &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть две транзакции &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства этих транзакций больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; между двумя транзакциями будем называть количество общих соседей этих транзакций, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве критериальной функции используется функция вида&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера. Функция &amp;lt;math&amp;gt;f(\theta)&amp;lt;/math&amp;gt; имеет вид&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(\theta)=\frac {1-\theta}{1+\theta}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\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;
# Вычисление количества связей между каждой парой транзакций (&amp;lt;math&amp;gt;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних транзакций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми транзакциями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Алгоритм Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждой транзакции значительно меньше общего количества транзакций, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей транзакции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет такую же вычислительную сложность, как и предыдущий шаг.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма можно оценить, как &amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
(to do)&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;M \times M&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; высота ЯПФ равна &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;M^2&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, следовательно высота ЯПФ равна &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;. Внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга, следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;logM&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи линейно, а ширина ЯПФ - квадратично.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; транзакциях, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов транзакции имеет значение &amp;quot;1&amp;quot;, каждую транзакцию можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
и тут&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=12268</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=12268"/>
		<updated>2016-10-15T22:33:47Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: &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(M)&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо множества) и другими. Множество значений, которые может принимать признак, называется доменом этого признака. Так, например, у объекта &#039;&#039;&#039;кошка&#039;&#039;&#039; может быть категорийный признак &#039;&#039;&#039;порода&#039;&#039;&#039;, доменом которого является множество &#039;&#039;&#039;[персидская, бенгальская, сфинкс, мейн-кун, ...]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с категорийными признаками.&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с использованием связей предназначен для работы с объектами типа &amp;quot;транзакция&amp;quot; (&amp;quot;покупательская корзина&amp;quot;). Транзакция представляет собой множество товаров, приобретенных покупателем у поставщика. Каждому товару, который есть в наличии у поставщика, в транзакции соответствует отдельный признак, который принимает значение &#039;&#039;&#039;true&#039;&#039;&#039;, если товар присутствует в транзакции, и &#039;&#039;&#039;false&#039;&#039;&#039;, если товар в транзакции отсутствует.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся транзакций &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть две транзакции &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства этих транзакций больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; между двумя транзакциями будем называть количество общих соседей этих транзакций, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве критериальной функции используется функция вида&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера. Функция &amp;lt;math&amp;gt;f(\theta)&amp;lt;/math&amp;gt; имеет вид&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(\theta)=\frac {1-\theta}{1+\theta}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\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;
# Вычисление количества связей между каждой парой транзакций (&amp;lt;math&amp;gt;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних транзакций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми транзакциями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Алгоритм Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждой транзакции значительно меньше общего количества транзакций, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей транзакции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет такую же вычислительную сложность, как и предыдущий шаг.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма можно оценить, как &amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
(to do)&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;M \times M&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; высота ЯПФ равна &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;M^2&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, следовательно высота ЯПФ равна &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;. Внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга, следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;logM&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи линейно, а ширина ЯПФ - квадратично.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; транзакциях, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов транзакции имеет значение &amp;quot;1&amp;quot;, каждую транзакцию можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
и тут&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=12267</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=12267"/>
		<updated>2016-10-15T22:33:25Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: /* Свойства алгоритма */&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^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(M)&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо множества) и другими. Множество значений, которые может принимать признак, называется доменом этого признака. Так, например, у объекта &#039;&#039;&#039;кошка&#039;&#039;&#039; может быть категорийный признак &#039;&#039;&#039;порода&#039;&#039;&#039;, доменом которого является множество &#039;&#039;&#039;[персидская, бенгальская, сфинкс, мейн-кун, ...]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с категорийными признаками.&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с использованием связей предназначен для работы с объектами типа &amp;quot;транзакция&amp;quot; (&amp;quot;покупательская корзина&amp;quot;). Транзакция представляет собой множество товаров, приобретенных покупателем у поставщика. Каждому товару, который есть в наличии у поставщика, в транзакции соответствует отдельный признак, который принимает значение &#039;&#039;&#039;true&#039;&#039;&#039;, если товар присутствует в транзакции, и &#039;&#039;&#039;false&#039;&#039;&#039;, если товар в транзакции отсутствует.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся транзакций &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть две транзакции &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства этих транзакций больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; между двумя транзакциями будем называть количество общих соседей этих транзакций, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве критериальной функции используется функция вида&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера. Функция &amp;lt;math&amp;gt;f(\theta)&amp;lt;/math&amp;gt; имеет вид&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(\theta)=\frac {1-\theta}{1+\theta}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\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;
# Вычисление количества связей между каждой парой транзакций (&amp;lt;math&amp;gt;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних транзакций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми транзакциями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Алгоритм Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждой транзакции значительно меньше общего количества транзакций, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей транзакции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет такую же вычислительную сложность, как и предыдущий шаг.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма можно оценить, как &amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
(to do)&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;M \times M&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; высота ЯПФ равна &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;M^2&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, следовательно высота ЯПФ равна &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;. Внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга, следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;logM&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи линейно, а ширина ЯПФ - квадратично.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; транзакциях, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов транзакции имеет значение &amp;quot;1&amp;quot;, каждую транзакцию можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
и тут&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=12266</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=12266"/>
		<updated>2016-10-15T22:32:41Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: /* Свойства алгоритма */&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^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(M)&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо множества) и другими. Множество значений, которые может принимать признак, называется доменом этого признака. Так, например, у объекта &#039;&#039;&#039;кошка&#039;&#039;&#039; может быть категорийный признак &#039;&#039;&#039;порода&#039;&#039;&#039;, доменом которого является множество &#039;&#039;&#039;[персидская, бенгальская, сфинкс, мейн-кун, ...]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с категорийными признаками.&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с использованием связей предназначен для работы с объектами типа &amp;quot;транзакция&amp;quot; (&amp;quot;покупательская корзина&amp;quot;). Транзакция представляет собой множество товаров, приобретенных покупателем у поставщика. Каждому товару, который есть в наличии у поставщика, в транзакции соответствует отдельный признак, который принимает значение &#039;&#039;&#039;true&#039;&#039;&#039;, если товар присутствует в транзакции, и &#039;&#039;&#039;false&#039;&#039;&#039;, если товар в транзакции отсутствует.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся транзакций &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть две транзакции &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства этих транзакций больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; между двумя транзакциями будем называть количество общих соседей этих транзакций, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве критериальной функции используется функция вида&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера. Функция &amp;lt;math&amp;gt;f(\theta)&amp;lt;/math&amp;gt; имеет вид&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(\theta)=\frac {1-\theta}{1+\theta}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\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;
# Вычисление количества связей между каждой парой транзакций (&amp;lt;math&amp;gt;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних транзакций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми транзакциями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Алгоритм Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждой транзакции значительно меньше общего количества транзакций, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей транзакции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет такую же вычислительную сложность, как и предыдущий шаг.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма можно оценить, как &amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
(to do)&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;M \times M&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; высота ЯПФ равна &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;M^2&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, следовательно высота ЯПФ равна &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;. Внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга, следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;logM&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи линейно, а ширина ЯПФ - квадратично.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; транзакциях, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов транзакции имеет значение &amp;quot;1&amp;quot;, каждую транзакцию можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
и тут&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=12265</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=12265"/>
		<updated>2016-10-15T22:32:07Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: /* Свойства алгоритма */&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^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(M)&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо множества) и другими. Множество значений, которые может принимать признак, называется доменом этого признака. Так, например, у объекта &#039;&#039;&#039;кошка&#039;&#039;&#039; может быть категорийный признак &#039;&#039;&#039;порода&#039;&#039;&#039;, доменом которого является множество &#039;&#039;&#039;[персидская, бенгальская, сфинкс, мейн-кун, ...]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с категорийными признаками.&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с использованием связей предназначен для работы с объектами типа &amp;quot;транзакция&amp;quot; (&amp;quot;покупательская корзина&amp;quot;). Транзакция представляет собой множество товаров, приобретенных покупателем у поставщика. Каждому товару, который есть в наличии у поставщика, в транзакции соответствует отдельный признак, который принимает значение &#039;&#039;&#039;true&#039;&#039;&#039;, если товар присутствует в транзакции, и &#039;&#039;&#039;false&#039;&#039;&#039;, если товар в транзакции отсутствует.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся транзакций &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть две транзакции &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства этих транзакций больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; между двумя транзакциями будем называть количество общих соседей этих транзакций, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве критериальной функции используется функция вида&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера. Функция &amp;lt;math&amp;gt;f(\theta)&amp;lt;/math&amp;gt; имеет вид&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(\theta)=\frac {1-\theta}{1+\theta}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\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;
# Вычисление количества связей между каждой парой транзакций (&amp;lt;math&amp;gt;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних транзакций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми транзакциями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Алгоритм Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждой транзакции значительно меньше общего количества транзакций, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей транзакции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет такую же вычислительную сложность, как и предыдущий шаг.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма можно оценить, как &amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
(to do)&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;M \times M&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; высота ЯПФ равна &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;M^2&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, следовательно высота ЯПФ равна &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;. Внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга, следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;logM&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи линейно, а ширина ЯПФ - квадратично.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; транзакциях, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов транзакции имеет значение &amp;quot;1&amp;quot;, каждую транзакцию можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&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;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
и тут&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=12260</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=12260"/>
		<updated>2016-10-15T22:28:51Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: &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^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(M)&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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо множества) и другими. Множество значений, которые может принимать признак, называется доменом этого признака. Так, например, у объекта &#039;&#039;&#039;кошка&#039;&#039;&#039; может быть категорийный признак &#039;&#039;&#039;порода&#039;&#039;&#039;, доменом которого является множество &#039;&#039;&#039;[персидская, бенгальская, сфинкс, мейн-кун, ...]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с категорийными признаками.&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с использованием связей предназначен для работы с объектами типа &amp;quot;транзакция&amp;quot; (&amp;quot;покупательская корзина&amp;quot;). Транзакция представляет собой множество товаров, приобретенных покупателем у поставщика. Каждому товару, который есть в наличии у поставщика, в транзакции соответствует отдельный признак, который принимает значение &#039;&#039;&#039;true&#039;&#039;&#039;, если товар присутствует в транзакции, и &#039;&#039;&#039;false&#039;&#039;&#039;, если товар в транзакции отсутствует.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся транзакций &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть две транзакции &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства этих транзакций больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; между двумя транзакциями будем называть количество общих соседей этих транзакций, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве критериальной функции используется функция вида&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера. Функция &amp;lt;math&amp;gt;f(\theta)&amp;lt;/math&amp;gt; имеет вид&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(\theta)=\frac {1-\theta}{1+\theta}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\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;
# Вычисление количества связей между каждой парой транзакций (&amp;lt;math&amp;gt;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних транзакций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми транзакциями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Алгоритм Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждой транзакции значительно меньше общего количества транзакций, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей транзакции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет такую же вычислительную сложность, как и предыдущий шаг.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма можно оценить, как &amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
(to do)&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;M \times M&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; высота ЯПФ равна &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;M^2&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, следовательно высота ЯПФ равна &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;. Внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга, следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;logM&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи линейно, а ширина ЯПФ - квадратично.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; транзакциях, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов транзакции имеет значение &amp;quot;1&amp;quot;, каждую транзакцию можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&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;
(to do)&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
и тут&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=12258</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=12258"/>
		<updated>2016-10-15T22:28:28Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: /* Ресурс параллелизма алгоритма */&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^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;...&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;...&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо множества) и другими. Множество значений, которые может принимать признак, называется доменом этого признака. Так, например, у объекта &#039;&#039;&#039;кошка&#039;&#039;&#039; может быть категорийный признак &#039;&#039;&#039;порода&#039;&#039;&#039;, доменом которого является множество &#039;&#039;&#039;[персидская, бенгальская, сфинкс, мейн-кун, ...]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с категорийными признаками.&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с использованием связей предназначен для работы с объектами типа &amp;quot;транзакция&amp;quot; (&amp;quot;покупательская корзина&amp;quot;). Транзакция представляет собой множество товаров, приобретенных покупателем у поставщика. Каждому товару, который есть в наличии у поставщика, в транзакции соответствует отдельный признак, который принимает значение &#039;&#039;&#039;true&#039;&#039;&#039;, если товар присутствует в транзакции, и &#039;&#039;&#039;false&#039;&#039;&#039;, если товар в транзакции отсутствует.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся транзакций &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть две транзакции &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства этих транзакций больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; между двумя транзакциями будем называть количество общих соседей этих транзакций, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве критериальной функции используется функция вида&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера. Функция &amp;lt;math&amp;gt;f(\theta)&amp;lt;/math&amp;gt; имеет вид&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(\theta)=\frac {1-\theta}{1+\theta}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\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;
# Вычисление количества связей между каждой парой транзакций (&amp;lt;math&amp;gt;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних транзакций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми транзакциями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Алгоритм Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждой транзакции значительно меньше общего количества транзакций, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей транзакции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет такую же вычислительную сложность, как и предыдущий шаг.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма можно оценить, как &amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
(to do)&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;M \times M&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; высота ЯПФ равна &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, а ширина - &amp;lt;math&amp;gt;M^2&amp;lt;/math&amp;gt; (&#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]]&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, следовательно высота ЯПФ равна &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;. Внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга, следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;logM&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, высота ЯПФ зависит от размерности задачи линейно, а ширина ЯПФ - квадратично.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; транзакциях, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов транзакции имеет значение &amp;quot;1&amp;quot;, каждую транзакцию можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&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;
(to do)&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
и тут&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=12254</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=12254"/>
		<updated>2016-10-15T22:20:38Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: /* Ресурс параллелизма алгоритма */&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^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;...&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;...&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо множества) и другими. Множество значений, которые может принимать признак, называется доменом этого признака. Так, например, у объекта &#039;&#039;&#039;кошка&#039;&#039;&#039; может быть категорийный признак &#039;&#039;&#039;порода&#039;&#039;&#039;, доменом которого является множество &#039;&#039;&#039;[персидская, бенгальская, сфинкс, мейн-кун, ...]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с категорийными признаками.&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с использованием связей предназначен для работы с объектами типа &amp;quot;транзакция&amp;quot; (&amp;quot;покупательская корзина&amp;quot;). Транзакция представляет собой множество товаров, приобретенных покупателем у поставщика. Каждому товару, который есть в наличии у поставщика, в транзакции соответствует отдельный признак, который принимает значение &#039;&#039;&#039;true&#039;&#039;&#039;, если товар присутствует в транзакции, и &#039;&#039;&#039;false&#039;&#039;&#039;, если товар в транзакции отсутствует.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся транзакций &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть две транзакции &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства этих транзакций больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; между двумя транзакциями будем называть количество общих соседей этих транзакций, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве критериальной функции используется функция вида&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера. Функция &amp;lt;math&amp;gt;f(\theta)&amp;lt;/math&amp;gt; имеет вид&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(\theta)=\frac {1-\theta}{1+\theta}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\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;
# Вычисление количества связей между каждой парой транзакций (&amp;lt;math&amp;gt;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних транзакций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми транзакциями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Алгоритм Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждой транзакции значительно меньше общего количества транзакций, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей транзакции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет такую же вычислительную сложность, как и предыдущий шаг.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма можно оценить, как &amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
(to do)&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;M \times M&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; &#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]] или [[Перемножение_разреженных_матриц|перемножение разреженных матриц]] в зависимости от специфики входных данных&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично шагу 3.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, следовательно высота ЯПФ равна &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;. Внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга, следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;logM&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; транзакциях, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов транзакции имеет значение &amp;quot;1&amp;quot;, каждую транзакцию можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&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;
(to do)&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
и тут&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=12253</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=12253"/>
		<updated>2016-10-15T22:19:21Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: /* Ресурс параллелизма алгоритма */&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^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;...&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;...&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо множества) и другими. Множество значений, которые может принимать признак, называется доменом этого признака. Так, например, у объекта &#039;&#039;&#039;кошка&#039;&#039;&#039; может быть категорийный признак &#039;&#039;&#039;порода&#039;&#039;&#039;, доменом которого является множество &#039;&#039;&#039;[персидская, бенгальская, сфинкс, мейн-кун, ...]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с категорийными признаками.&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с использованием связей предназначен для работы с объектами типа &amp;quot;транзакция&amp;quot; (&amp;quot;покупательская корзина&amp;quot;). Транзакция представляет собой множество товаров, приобретенных покупателем у поставщика. Каждому товару, который есть в наличии у поставщика, в транзакции соответствует отдельный признак, который принимает значение &#039;&#039;&#039;true&#039;&#039;&#039;, если товар присутствует в транзакции, и &#039;&#039;&#039;false&#039;&#039;&#039;, если товар в транзакции отсутствует.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся транзакций &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть две транзакции &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства этих транзакций больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; между двумя транзакциями будем называть количество общих соседей этих транзакций, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве критериальной функции используется функция вида&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера. Функция &amp;lt;math&amp;gt;f(\theta)&amp;lt;/math&amp;gt; имеет вид&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(\theta)=\frac {1-\theta}{1+\theta}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\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;
# Вычисление количества связей между каждой парой транзакций (&amp;lt;math&amp;gt;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних транзакций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми транзакциями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Алгоритм Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждой транзакции значительно меньше общего количества транзакций, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей транзакции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет такую же вычислительную сложность, как и предыдущий шаг.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма можно оценить, как &amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
(to do)&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;M \times M&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; &#039;&#039;см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]] или [[Перемножение_разреженных_матриц|перемножение разреженных матриц]] в зависимости от специфики входных данных&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, следовательно высота ЯПФ равна &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;. Внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга, следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;logM&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; транзакциях, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов транзакции имеет значение &amp;quot;1&amp;quot;, каждую транзакцию можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&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;
(to do)&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
и тут&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</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:Viktorrulev/%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=12252</id>
		<title>Участник:Viktorrulev/Алгоритм устойчивой кластеризации с и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:Viktorrulev/%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=12252"/>
		<updated>2016-10-15T22:19:05Z</updated>

		<summary type="html">&lt;p&gt;Viktorrulev: /* Ресурс параллелизма алгоритма */&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^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;...&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;...&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;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;
Автор описания: [[Участник:viktorrulev|В.А. Рулев]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (кластерный анализ) — задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Каждый объект из выборки характеризуется рядом признаков, которые могут быть вещественными, целочисленными, категорийными (то есть принимающими значения из какого-либо множества) и другими. Множество значений, которые может принимать признак, называется доменом этого признака. Так, например, у объекта &#039;&#039;&#039;кошка&#039;&#039;&#039; может быть категорийный признак &#039;&#039;&#039;порода&#039;&#039;&#039;, доменом которого является множество &#039;&#039;&#039;[персидская, бенгальская, сфинкс, мейн-кун, ...]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм устойчивой кластеризации с иcпользованием связей (robust clustering using links, ROCK)&#039;&#039;&#039; был предложен в 2000 году Sudipto Guha (Stanford University), Rajeev Rastogi (Bell Laboratories) и Kyuseok Shim (Bell Laboratories) &amp;lt;ref&amp;gt;Sudipto Guha, Rajeev Rastogi, Kyuseok Shim ROCK: A robust clustering algorithm for categorical attributes. 2000. Information Systems. Vol 25, Issue 5, Pages 345-366&amp;lt;/ref&amp;gt; для кластеризации объектов с категорийными признаками.&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчивой кластеризации с использованием связей предназначен для работы с объектами типа &amp;quot;транзакция&amp;quot; (&amp;quot;покупательская корзина&amp;quot;). Транзакция представляет собой множество товаров, приобретенных покупателем у поставщика. Каждому товару, который есть в наличии у поставщика, в транзакции соответствует отдельный признак, который принимает значение &#039;&#039;&#039;true&#039;&#039;&#039;, если товар присутствует в транзакции, и &#039;&#039;&#039;false&#039;&#039;&#039;, если товар в транзакции отсутствует.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; имеющихся транзакций &amp;lt;math&amp;gt;P=\{p_1,...,p_M\}&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; непересекающихся подмножеств (кластеров) &amp;lt;math&amp;gt;C_1, ..., C_K&amp;lt;/math&amp;gt; таким образом, чтобы полученные кластеры максимизировали некоторую критериальную функцию &amp;lt;math&amp;gt;E(C_1, ..., C_K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будет называть две транзакции &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt; &#039;&#039;&#039;соседями&#039;&#039;&#039;, если мера сходства этих транзакций больше некоторого заранее заданного порогового значения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;neighbour(p_1,p_2)=(sim(p_1,p_2)&amp;gt;\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве меры сходства в алгоритме устойчивой кластеризации с использованием связей используется основанная на коэффициенте Жаккара мера сходства&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;sim(p_1,p_2)=\frac{N(p_1 \cap p_2)}{N(p_1 \cup p_2)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Количеством связей&#039;&#039;&#039; между двумя транзакциями будем называть количество общих соседей этих транзакций, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;link(p_1,p_2)=N \Big( \{ p \in P | sim(p_1,p) &amp;lt; \theta \} \cap \{ p \in P | sim(p_2,p) &amp;lt; \theta \} \Big)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве критериальной функции используется функция вида&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;E(C_1,...,C_K)=\sum_{i=1}^{K}N(C_i) \ast  \sum_{p_q,p_r \in C_i}\frac{link(p_q,p_r)}{N(C_i)^{1+2f(\theta)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;N(C_i)^{1+2f(\theta)}&amp;lt;/math&amp;gt; имеет смысл ожидаемого (среднего) количества связей внутри одного кластера. Функция &amp;lt;math&amp;gt;f(\theta)&amp;lt;/math&amp;gt; имеет вид&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(\theta)=\frac {1-\theta}{1+\theta}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы сформировать кластеры, удовлетворяющие поставленному условию, необходимо последовательно объединять среди имеющихся кластеров такие пары кластеров, для которых метрика&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;goodness(C_i,C_j)=\frac {\sum_{p_r \in C_i, p_q \in C_j}{link(p_r,p_q)}} {(N(C_i) + N(C_j))^{1+2f(\theta)} - N(C_i)^{1+2f(\theta)} - N(C_j)^{1+2f(\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;
# Вычисление количества связей между каждой парой транзакций (&amp;lt;math&amp;gt;\frac {M \times M} {2}&amp;lt;/math&amp;gt; вычислений количества связей)&lt;br /&gt;
# Последовательные объединения пар наиболее подходящих кластеров (&amp;lt;math&amp;gt;M-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;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; вычисление соседних транзакций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; вычисление количества связей между всеми транзакциями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; построение для каждого кластера упорядоченного списка значений метрики goodness со всеми остальными кластерами&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; построение общего упорядоченного списка значений метрики goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5 (повторяется то тех пор, пока количество кластеров не достигнет желаемого)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.1:&#039;&#039;&#039; объединение двух кластеров с наилучшим goodness&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5.2:&#039;&#039;&#039; обновление списков кластеров&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;&amp;gt;&lt;br /&gt;
procedure compute_links(P)&lt;br /&gt;
begin&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    if sim(p[i], p[j]) &amp;gt; theta&lt;br /&gt;
      is_neighbour[i, j] = true&lt;br /&gt;
    else&lt;br /&gt;
      is_neighbour[i, j] = false&lt;br /&gt;
&lt;br /&gt;
  links[i, j] = 0&lt;br /&gt;
  for each p[i], p[j] in P do&lt;br /&gt;
    for p[k] in P do&lt;br /&gt;
      if is_neighbour[i, k] &amp;amp;&amp;amp; is_neighbour[j, k]&lt;br /&gt;
        links[i, j] = links[i, j] + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
procedure cluster(P, k)&lt;br /&gt;
begin&lt;br /&gt;
  links := compute_links(P)&lt;br /&gt;
&lt;br /&gt;
  for each p in P do&lt;br /&gt;
    q[p] := build_local_list(links, p)&lt;br /&gt;
  Q := build global_list(P, q)&lt;br /&gt;
&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 := extract_max(q[u])&lt;br /&gt;
    w := merge(u, v)&lt;br /&gt;
    delete(Q, v)&lt;br /&gt;
&lt;br /&gt;
    for each x in (q[u] or q[v]) do&lt;br /&gt;
    begin&lt;br /&gt;
      delete(q[x], u);&lt;br /&gt;
      delete(q[x], v)&lt;br /&gt;
      insert(q[x], w, goodness(x, w))&lt;br /&gt;
      insert(q[w], x, goodness(x, w))&lt;br /&gt;
      update(Q, x, q[x])&lt;br /&gt;
    end&lt;br /&gt;
&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;
Рассмотрим сложности шагов алгоритма из раздела 1.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; выполняется с помощью двух вложенных циклов и содержит &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt; операций&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; задача сводится к умножению полученной на предыдущем шаге матрицы соседства на саму себя. Это действие быть выполнено с помощью наивного метода за &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt; операций. С помощью алгоритма Алгоритм Копперсмита — Винограда это можно сделать за &amp;lt;math&amp;gt;O(M^{2.37})&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;Donald Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions. In Proc. of the 19th Annual ACM Symposium on Theory of Computing. 1987.&amp;lt;/ref&amp;gt; В случае, если среднее количество соседей каждой транзакции значительно меньше общего количества транзакций, связи могут быть вычислены за &amp;lt;math&amp;gt;O(M^2m_{nbr})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m_{nbr}&amp;lt;/math&amp;gt; - среднее количество соседей транзакции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет сложность &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to&lt;br /&gt;
Algorithms. The MIT Press, Massachusetts, 1990.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; имеет такую же вычислительную сложность, как и предыдущий шаг.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; вычислительная сложность каждой итерации цикла составляет &amp;lt;math&amp;gt;O(MlogM)&amp;lt;/math&amp;gt;, так как в худшем случае в ходе итерации выполняется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; вставок элемента в упорядоченный список. Желаемое количество кластеров &amp;lt;math&amp;gt;K&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;O(M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общую последовательную сложность алгоритма можно оценить, как &amp;lt;math&amp;gt;O(M^2 + M^{2.37} + M^{2}logM)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(M^2 + M^2m_{nbr} + M^{2}logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
(to do)&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; каждая итерация цикла может быть выполнена независимо от всех остальных. Таким образом, в этом случае ширина ЯПФ равна &amp;lt;math&amp;gt;M \times M&amp;lt;/math&amp;gt;, а высота - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; см. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножение плотных матриц]] или [[Перемножение_разреженных_матриц|перемножение разреженных матриц]] в зависимости от специфики входных данных&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; имеет небольшую асимптотическую сложность, может быть выполнен последовательно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; аналогично.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 5:&#039;&#039;&#039; каждая итерация цикла может быть выполнена только после полного завершения предыдущей, следовательно высота ЯПФ равна &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;. Внутри каждой отдельной итерации все вставки могут быть выполнены независимо друг от друга, следовательно ширина ЯПФ в этом случае равна &amp;lt;math&amp;gt;logM&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: информация об &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; транзакциях, каждая их которых имеет &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; бинарных атрибутов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M \times N&amp;lt;/math&amp;gt; бинарных переменных. В силу того, что обычно в большинстве случаев лишь небольшое количество атрибутов транзакции имеет значение &amp;quot;1&amp;quot;, каждую транзакцию можно хранить в виде списка номеров атрибутов, значения которых равны &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;M&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;
(to do)&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
и тут&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
и тут&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Viktorrulev</name></author>
	</entry>
</feed>