<?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=Boltonidze</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=Boltonidze"/>
	<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/Boltonidze"/>
	<updated>2026-10-22T20:10:09Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D0%BD%D0%B4%D1%80%D0%B5%D0%B9_%D0%A2%D1%83%D0%BC%D0%B0%D0%BD%D0%BE%D0%B2/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_CLOPE&amp;diff=16086</id>
		<title>Участник:Андрей Туманов/Алгоритм кластеризации категориальных данных CLOPE</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D0%BD%D0%B4%D1%80%D0%B5%D0%B9_%D0%A2%D1%83%D0%BC%D0%B0%D0%BD%D0%BE%D0%B2/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_CLOPE&amp;diff=16086"/>
		<updated>2016-11-07T21:18:22Z</updated>

		<summary type="html">&lt;p&gt;Boltonidze: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Андрей_Туманов|А.Л.Туманов]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Входные и выходные данные алгоритма|1.9]]), [[Участник:Александр_Александров|А.В.Александров]] ([[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]] [[#Существующие реализации алгоритма|2.7]])&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Алгоритм CLOPE (Clustering with sLOPE&amp;lt;ref&amp;gt;Yang, Y., Guan, H., You. J. CLOPE: A fast and Effective Clustering Algorithm for Transactional Data In Proc. of SIGKDD’02, July 23-26, 2002, Edmonton, Alberta, Canada.&amp;lt;/ref&amp;gt;) неирархический метод кластеризации, предназначенный для кластеризации огромных наборов категориальных данных. К достоинствам алгоритма относятся высокие масштабируемость и скорость работы и качество кластеризации, что достигается использованием глобального критерия оптимизации на основе максимизации градиента высоты гистограммы кластера. Отличается простотой программной реализации. &lt;br /&gt;
&lt;br /&gt;
Во время работы алгоритм хранит в памяти небольшое количество информации по каждому кластеру и требует минимальное число сканирований набора данных. CLOPE автоматически подбирает количество кластеров, причем это регулируется одним единственным параметром - коэффициентом отталкивания &amp;lt;math&amp;gt; r &amp;lt;/math&amp;gt;. При этом он обеспечивает более высокую производительность и лучшее качество кластеризации в сравнении с многими иерархическими алгоритмами.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть имеется база транзакций &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, состоящая из множества транзакций &amp;lt;math&amp;gt;\{t_1,t_2,...,t_n\}&amp;lt;/math&amp;gt;. Каждая транзакция есть набор объектов &amp;lt;math&amp;gt;\{i_1,...,i_m\}&amp;lt;/math&amp;gt;. Множество кластеров &amp;lt;math&amp;gt;\{C_1,...,C_k\}&amp;lt;/math&amp;gt; есть разбиение множества &amp;lt;math&amp;gt;\{t_1,...,t_n\}&amp;lt;/math&amp;gt;, такое, что &amp;lt;math&amp;gt;C_1 \cup \dots \cup C_k=\{t_1,...,t_n\}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_i \ne \empty&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_i \cap C_j = \empty &amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i \ge 1, k \ge j&amp;lt;/math&amp;gt;. Каждый элемент &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; называется кластером, а &amp;lt;math&amp;gt;n, m, k&amp;lt;/math&amp;gt; – количество транзакций, количество объектов в базе транзакций и число кластеров соответственно.&lt;br /&gt;
&lt;br /&gt;
Каждый кластер &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; имеет следующие характеристики:&lt;br /&gt;
[[Файл:ExampleCLOPE.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;math&amp;gt;D(C)&amp;lt;/math&amp;gt; – множество уникальных объектов;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Occ(i,C)&amp;lt;/math&amp;gt; – количество вхождений (частота) объекта &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; в кластер &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;S(C)= \sum_{i \in D(C)} Occ(i,C)= \sum_{t_i \in C}  \mid t_i  \mid , &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;W(C)=  \mid D(C) \mid ,H(C)=S(C)/W(C) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Функция стоимости:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Profit(C) = \frac{\sum^{k}_{i=1} G(C_i) \times \mid C_i \mid} {\sum^{k}_{i=1} \mid C_i \mid } = \frac{\sum^{k}_{i=1} \frac{S(C_i)}{W(C_i)^r} \times \mid C_i \mid} {\sum^{k}_{i=1} \mid C_i \mid }  &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\mid C_i \mid&amp;lt;/math&amp;gt;  количество объектов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; – количество кластеров, &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; – коэффициент отталкивания &amp;lt;math&amp;gt;(0 &amp;lt; r \le 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С помощью параметра &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; регулируется уровень сходства транзакций внутри кластера, и, как&lt;br /&gt;
следствие, финальное количество кластеров. Этот коэффициент подбирается пользователем. Чем больше &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, тем ниже уровень сходства и тем больше кластеров будет сгенерировано.&lt;br /&gt;
&lt;br /&gt;
Постановка задачи кластеризации алгоритмом CLOPE выглядит следующим образом: &lt;br /&gt;
&lt;br /&gt;
для заданных &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; найти разбиение &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; такое, что: &lt;br /&gt;
&amp;lt;math&amp;gt;Profit(C) \longrightarrow max &amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt;Нейский И.М. Классификация и сравнение методов кластеризации.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма состоит в вычислении на каждой итерации стоимости добавления и удаления транзакции из кластера: &lt;br /&gt;
&lt;br /&gt;
*вычисление нового размера кластера &amp;lt;math&amp;gt;S_{new}(C_i)=S(C_i) \pm \mid(t_n)\mid &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid(t_n)\mid&amp;lt;/math&amp;gt; - длина транзакции&lt;br /&gt;
&lt;br /&gt;
*вычисление новой ширины кластера &amp;lt;math&amp;gt;W_{new}(C_i)=\mid D(C_i \cup t_n)|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*вычисление стоимости &amp;lt;math&amp;gt;\frac{S_{new}(C_i)(\mid C_i \mid \pm 1)}{W_{new}(C_i)^r} - \frac{S(C_i) \mid C_i \mid }{W(C_i)^r}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из следующих этапов:&lt;br /&gt;
&lt;br /&gt;
1. &#039;&#039;&#039;Инициализация&#039;&#039;&#039;. На этом этапе происходит первый проход по таблице с транзакциями для построения начального разбиения, для каждой транзакции определяется кластер исходя из максимизации стоимости.&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;Итерация&#039;&#039;&#039;. На данном этапе для каждой транзакции проводится попытка перемещения в другой кластер для максимизации функции стоимости.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первая часть алгоритма - инициализация: для каждой транзакции вычисляется кластер, к которому она будет отнесена исходя из максимизации функции стоимости. Для этого вычисляется вспомогательная функция DeltaAdd, которая считает стоимость добавления транзакции к одному из существующих кластеров, либо к пустому. В итоге транзакция помещается в кластер, для которого цена добавления максимальна.&lt;br /&gt;
&lt;br /&gt;
Вторая часть алгоритма - уточняющие итерации: здесь происходит попытка улучшить вычисленные на первом этапе кластеры. В каждой итерации происходит перебор всех транзакций, и для каждой транзакции вычисляется цена удаления ее из текущего кластера и цена добавления в другой кластер. Суммарная стоимость перемещения будет являться суммой стоимостей удаления и добавления. Если максимальная стоимость перемещения данной транзакции в какой-либо больше нуля, то она перемещается в этот кластер. &lt;br /&gt;
&lt;br /&gt;
Вычисления происходят до тех пор, пока за итерацию происходит хотя бы одно перемещение транзакции. Если за итерацию не было произведено ни одного перемещения, то текущее состояние кластеров является устойчивым и оптимальным. &amp;lt;ref&amp;gt;Павлин Н. Кластеризация категорийных данных: масштабируемый алгоритм CLOPE, https://basegroup.ru/community/articles/clope&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Схема реализации на псевдокоде:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Входные параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; - транзакции&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - коэффициент отталкивания&lt;br /&gt;
&lt;br /&gt;
Выходной параметр:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; кластеры, в начале алгоритма - пустое множество&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация:&#039;&#039;&#039;&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; t_i in t:&lt;br /&gt;
    max = 0&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; C_j in C:&lt;br /&gt;
            &#039;&#039;&#039;if&#039;&#039;&#039; DeltaAdd(C_j,t_i,r) &amp;gt; max:&lt;br /&gt;
                max = DeltaAdd(C_j,t_i,r)&lt;br /&gt;
                C_best = C_j&lt;br /&gt;
    &#039;&#039;&#039;put&#039;&#039;&#039; t_i in C_best&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итерации:&#039;&#039;&#039;&lt;br /&gt;
    move = True&lt;br /&gt;
    &#039;&#039;&#039;while&#039;&#039;&#039; move == True:&lt;br /&gt;
    move = False&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; t_i in t:&lt;br /&gt;
            max = 0&lt;br /&gt;
            C_now = t_i.cluster&lt;br /&gt;
            removeCost = DeltaRemove(C_now,t_i,r)&lt;br /&gt;
            &#039;&#039;&#039;for&#039;&#039;&#039; C_j in C:&lt;br /&gt;
                &#039;&#039;&#039;if&#039;&#039;&#039; DeltaAdd(C_j,t_i,r) + removeCost &amp;gt; max:&lt;br /&gt;
                    max = DeltaAdd(C_j,t_i,r) + removeCost&lt;br /&gt;
                    C_best = C_j&lt;br /&gt;
        if max &amp;gt; 0&lt;br /&gt;
            &#039;&#039;&#039;del&#039;&#039;&#039; t_i from C_now&lt;br /&gt;
            &#039;&#039;&#039;put&#039;&#039;&#039; t_i in C_best&lt;br /&gt;
            move = True&lt;br /&gt;
&lt;br /&gt;
Вспомогательная функция &#039;&#039;&#039;DeltaAdd&#039;&#039;&#039;:&lt;br /&gt;
    &#039;&#039;&#039;function&#039;&#039;&#039; DeltaAdd(C,t,r)&lt;br /&gt;
        S_new=C.size + t.itemCount&lt;br /&gt;
        W_new=C.wigth&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; item in t_i:&lt;br /&gt;
            &#039;&#039;&#039;if&#039;&#039;&#039; C_j.occ(item) = 0&lt;br /&gt;
                &#039;&#039;W_new = W_new + 1&lt;br /&gt;
        &#039;&#039;&#039;return&#039;&#039;&#039; S_new * (C.count+1) / (W_new ^ r) - (C.size * C.count) / (C.wigth ^ r)&lt;br /&gt;
&lt;br /&gt;
Вспомогательная функция &#039;&#039;&#039;DeltaRemove&#039;&#039;&#039;:&lt;br /&gt;
    &#039;&#039;&#039;function&#039;&#039;&#039; DeltaRemove(C,t,r)&lt;br /&gt;
        S_new=C.size - t.itemCount&lt;br /&gt;
        W_new=C.wigth&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; item in t:&lt;br /&gt;
            &#039;&#039;&#039;if&#039;&#039;&#039; C_j.occ(item) = 1&lt;br /&gt;
                &#039;&#039;W_new = W_new - 1&lt;br /&gt;
        &#039;&#039;&#039;return&#039;&#039;&#039; S_new * (C.count-1) / (W_new ^ r) - (C.size * C.count) / (C.wigth ^ r)&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В соответствии с ранее введенным обозначением &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - количество транзакций, &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - длина транзакции(максимальная), &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров.&lt;br /&gt;
&lt;br /&gt;
Основные вычисления восполняются в функции DeltaAdd/DeltaRemove: производится 1 сложение, не более &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; сложений/вычитаний, 2 умножения, 2 деления, 2 возведения в степень и 1 сложение - итого &amp;lt;math&amp;gt;m + 8&amp;lt;/math&amp;gt; операций. &lt;br /&gt;
&lt;br /&gt;
Операции выполняются для всех транзаций (&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; штук) и для всех кластеров (&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; штук). Итого выполняется &amp;lt;math&amp;gt;n*k*(m+8)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
В добавок к этому при добавлении/удалении транзакции к кластеру производится пересчет его характеристик: &amp;lt;math&amp;gt;m+2&amp;lt;/math&amp;gt; операции.&lt;br /&gt;
&lt;br /&gt;
Из того можно сделать вывод, что оценка сложность алгоритма равна &amp;lt;math&amp;gt;O(n*k*m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
На этапе инициализации при обработке каждой транзакции количество кластеров может как увеличиться, так и остаться неизменным. Это показано пунктирными линиями:&lt;br /&gt;
[[Файл:InitCLOPE.jpg|400px|center|Инициализация]]&lt;br /&gt;
На этапе итерации функции DeltaAdd/DeltaRemove могут считать параллельно для каждой транзакции&lt;br /&gt;
[[Файл:IterCLOPE.jpg ‎|400px|center|Итерации]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисление стоимости добавления/удаления транзакции, которые выполняются функциями DeltaAdd/DeltaRemove, происходит независимо для всех &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. Поэтому все вычисления можно производить параллельно. Таким образом сложность алгоритма с &amp;lt;math&amp;gt;O(n*k*m)&amp;lt;/math&amp;gt; понижается до &amp;lt;math&amp;gt;O(n*m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; транзакций длины &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и коэффициент отталкивания &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
метки классов для каждой транзакции в соответствии с проведенной кластеризацией(числовая последовательность длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности алгоритма определяется количеством кластеров: &amp;lt;math&amp;gt;\dfrac{O(n*k*m)}{O(n*m)} = k&amp;lt;/math&amp;gt;&lt;br /&gt;
* [[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] алгоритма равна &amp;lt;math&amp;gt;\dfrac{nk(m+8) + m + 2}{nm + n + 1} \cong k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Алгоритм не является [[глоссарий#Устойчивость|&#039;&#039;устойчивым&#039;&#039;]], так как результат работы зависит от порядка чтения транзакций и от текущего набора транзакций в кластере.&lt;br /&gt;
* Выполняется свойство сбалансированности операций между параллельными ветвями алгоритма, так как для каждой транзакции выполняются функции DeltaAdd/DeltaRemove, считающие стоимость добавления/удаления транзакции.&lt;br /&gt;
* Свойство [[глоссарий#Детерминированность|&#039;&#039;детерминированности алгоритмов&#039;&#039;]] не выполняется, так как результат алгоритма зависит от порядка прохождения транзакций. Но если рассматривать транзакции как нумерованный список, то результат будет определен однозначно от запуска к запуску. Однако существует расширение алгоритма, обеспечивающее свойство детерминированности. &amp;lt;ref&amp;gt;Li, Y., Le, J., Wang, M. Improving CLOPE’s Profit Value and Stability with an Optimized Agglomerative Approach. Algorithms 2015, 8, 380-394.&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;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* http://weka.sourceforge.net/doc.stable/weka/clusterers/CLOPE.html - реализация в open source библиотеке для анализа данных WEKA(Waikato Environment for Knowledge Analysis) на языке Java&lt;br /&gt;
Также существуют пользовательские реализации алгоритма:&lt;br /&gt;
* https://github.com/infozor/php_mysql_clustering_clope - реализация алгоритма на PHP&lt;br /&gt;
* https://github.com/Tolsi/scala-clope - реализация алгоритма Scala&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Boltonidze</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D0%BD%D0%B4%D1%80%D0%B5%D0%B9_%D0%A2%D1%83%D0%BC%D0%B0%D0%BD%D0%BE%D0%B2/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_CLOPE&amp;diff=16085</id>
		<title>Участник:Андрей Туманов/Алгоритм кластеризации категориальных данных CLOPE</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D0%BD%D0%B4%D1%80%D0%B5%D0%B9_%D0%A2%D1%83%D0%BC%D0%B0%D0%BD%D0%BE%D0%B2/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_CLOPE&amp;diff=16085"/>
		<updated>2016-11-07T21:14:01Z</updated>

		<summary type="html">&lt;p&gt;Boltonidze: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Андрей_Туманов|А.Л.Туманов]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Входные и выходные данные алгоритма|1.9]]), [[Участник:Александр_Александров|А.В.Александров]] ([[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]] [[#Существующие реализации алгоритма|2.7]])&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Алгоритм CLOPE (Clustering with sLOPE&amp;lt;ref&amp;gt;Yang, Y., Guan, H., You. J. CLOPE: A fast and Effective Clustering Algorithm for Transactional Data In Proc. of SIGKDD’02, July 23-26, 2002, Edmonton, Alberta, Canada.&amp;lt;/ref&amp;gt;) неирархический метод кластеризации, предназначенный для кластеризации огромных наборов категориальных данных. К достоинствам алгоритма относятся высокие масштабируемость и скорость работы и качество кластеризации, что достигается использованием глобального критерия оптимизации на основе максимизации градиента высоты гистограммы кластера. Отличается простотой программной реализации. &lt;br /&gt;
&lt;br /&gt;
Во время работы алгоритм хранит в памяти небольшое количество информации по каждому кластеру и требует минимальное число сканирований набора данных. CLOPE автоматически подбирает количество кластеров, причем это регулируется одним единственным параметром - коэффициентом отталкивания &amp;lt;math&amp;gt; r &amp;lt;/math&amp;gt;. При этом он обеспечивает более высокую производительность и лучшее качество кластеризации в сравнении с многими иерархическими алгоритмами.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть имеется база транзакций &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, состоящая из множества транзакций &amp;lt;math&amp;gt;\{t_1,t_2,...,t_n\}&amp;lt;/math&amp;gt;. Каждая транзакция есть набор объектов &amp;lt;math&amp;gt;\{i_1,...,i_m\}&amp;lt;/math&amp;gt;. Множество кластеров &amp;lt;math&amp;gt;\{C_1,...,C_k\}&amp;lt;/math&amp;gt; есть разбиение множества &amp;lt;math&amp;gt;\{t_1,...,t_n\}&amp;lt;/math&amp;gt;, такое, что &amp;lt;math&amp;gt;C_1 \cup \dots \cup C_k=\{t_1,...,t_n\}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_i \ne \empty&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_i \cap C_j = \empty &amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i \ge 1, k \ge j&amp;lt;/math&amp;gt;. Каждый элемент &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; называется кластером, а &amp;lt;math&amp;gt;n, m, k&amp;lt;/math&amp;gt; – количество транзакций, количество объектов в базе транзакций и число кластеров соответственно.&lt;br /&gt;
&lt;br /&gt;
Каждый кластер &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; имеет следующие характеристики:&lt;br /&gt;
[[Файл:ExampleCLOPE.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;math&amp;gt;D(C)&amp;lt;/math&amp;gt; – множество уникальных объектов;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Occ(i,C)&amp;lt;/math&amp;gt; – количество вхождений (частота) объекта &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; в кластер &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;S(C)= \sum_{i \in D(C)} Occ(i,C)= \sum_{t_i \in C}  \mid t_i  \mid , &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;W(C)=  \mid D(C) \mid ,H(C)=S(C)/W(C) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Функция стоимости:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Profit(C) = \frac{\sum^{k}_{i=1} G(C_i) \times \mid C_i \mid} {\sum^{k}_{i=1} \mid C_i \mid } = \frac{\sum^{k}_{i=1} \frac{S(C_i)}{W(C_i)^r} \times \mid C_i \mid} {\sum^{k}_{i=1} \mid C_i \mid }  &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\mid C_i \mid&amp;lt;/math&amp;gt;  количество объектов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; – количество кластеров, &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; – коэффициент отталкивания &amp;lt;math&amp;gt;(0 &amp;lt; r \le 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С помощью параметра &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; регулируется уровень сходства транзакций внутри кластера, и, как&lt;br /&gt;
следствие, финальное количество кластеров. Этот коэффициент подбирается пользователем. Чем больше &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, тем ниже уровень сходства и тем больше кластеров будет сгенерировано.&lt;br /&gt;
&lt;br /&gt;
Постановка задачи кластеризации алгоритмом CLOPE выглядит следующим образом: &lt;br /&gt;
&lt;br /&gt;
для заданных &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; найти разбиение &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; такое, что: &lt;br /&gt;
&amp;lt;math&amp;gt;Profit(C) \longrightarrow max &amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt;Нейский И.М. Классификация и сравнение методов кластеризации.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма состоит в вычислении на каждой итерации стоимости добавления и удаления транзакции из кластера: &lt;br /&gt;
&lt;br /&gt;
*вычисление нового размера кластера &amp;lt;math&amp;gt;S_{new}(C_i)=S(C_i) \pm \mid(t_n)\mid &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid(t_n)\mid&amp;lt;/math&amp;gt; - длина транзакции&lt;br /&gt;
&lt;br /&gt;
*вычисление новой ширины кластера &amp;lt;math&amp;gt;W_{new}(C_i)=\mid D(C_i \cup t_n)|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*вычисление стоимости &amp;lt;math&amp;gt;\frac{S_{new}(C_i)(\mid C_i \mid \pm 1)}{W_{new}(C_i)^r} - \frac{S(C_i) \mid C_i \mid }{W(C_i)^r}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из следующих этапов:&lt;br /&gt;
&lt;br /&gt;
1. &#039;&#039;&#039;Инициализация&#039;&#039;&#039;. На этом этапе происходит первый проход по таблице с транзакциями для построения начального разбиения, для каждой транзакции определяется кластер исходя из максимизации стоимости.&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;Итерация&#039;&#039;&#039;. На данном этапе для каждой транзакции проводится попытка перемещения в другой кластер для максимизации функции стоимости.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первая часть алгоритма - инициализация: для каждой транзакции вычисляется кластер, к которому она будет отнесена исходя из максимизации функции стоимости. Для этого вычисляется вспомогательная функция DeltaAdd, которая считает стоимость добавления транзакции к одному из существующих кластеров, либо к пустому. В итоге транзакция помещается в кластер, для которого цена добавления максимальна.&lt;br /&gt;
&lt;br /&gt;
Вторая часть алгоритма - уточняющие итерации: здесь происходит попытка улучшить вычисленные на первом этапе кластеры. В каждой итерации происходит перебор всех транзакций, и для каждой транзакции вычисляется цена удаления ее из текущего кластера и цена добавления в другой кластер. Суммарная стоимость перемещения будет являться суммой стоимостей удаления и добавления. Если максимальная стоимость перемещения данной транзакции в какой-либо больше нуля, то она перемещается в этот кластер. &lt;br /&gt;
&lt;br /&gt;
Вычисления происходят до тех пор, пока за итерацию происходит хотя бы одно перемещение транзакции. Если за итерацию не было произведено ни одного перемещения, то текущее состояние кластеров является устойчивым и оптимальным. &amp;lt;ref&amp;gt;Павлин Н. Кластеризация категорийных данных: масштабируемый алгоритм CLOPE, https://basegroup.ru/community/articles/clope&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Схема реализации на псевдокоде:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Входные параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; - транзакции&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - коэффициент отталкивания&lt;br /&gt;
&lt;br /&gt;
Выходной параметр:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; кластеры, в начале алгоритма - пустое множество&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация:&#039;&#039;&#039;&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; t_i in t:&lt;br /&gt;
    max = 0&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; C_j in C:&lt;br /&gt;
            &#039;&#039;&#039;if&#039;&#039;&#039; DeltaAdd(C_j,t_i,r) &amp;gt; max:&lt;br /&gt;
                max = DeltaAdd(C_j,t_i,r)&lt;br /&gt;
                C_best = C_j&lt;br /&gt;
    &#039;&#039;&#039;put&#039;&#039;&#039; t_i in C_best&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итерации:&#039;&#039;&#039;&lt;br /&gt;
    move = True&lt;br /&gt;
    &#039;&#039;&#039;while&#039;&#039;&#039; move == True:&lt;br /&gt;
    move = False&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; t_i in t:&lt;br /&gt;
            max = 0&lt;br /&gt;
            C_now = t_i.cluster&lt;br /&gt;
            removeCost = DeltaRemove(C_now,t_i,r)&lt;br /&gt;
            &#039;&#039;&#039;for&#039;&#039;&#039; C_j in C:&lt;br /&gt;
                &#039;&#039;&#039;if&#039;&#039;&#039; DeltaAdd(C_j,t_i,r) + removeCost &amp;gt; max:&lt;br /&gt;
                    max = DeltaAdd(C_j,t_i,r) + removeCost&lt;br /&gt;
                    C_best = C_j&lt;br /&gt;
        if max &amp;gt; 0&lt;br /&gt;
            &#039;&#039;&#039;del&#039;&#039;&#039; t_i from C_now&lt;br /&gt;
            &#039;&#039;&#039;put&#039;&#039;&#039; t_i in C_best&lt;br /&gt;
            move = True&lt;br /&gt;
&lt;br /&gt;
Вспомогательная функция &#039;&#039;&#039;DeltaAdd&#039;&#039;&#039;:&lt;br /&gt;
    &#039;&#039;&#039;function&#039;&#039;&#039; DeltaAdd(C,t,r)&lt;br /&gt;
        S_new=C.size + t.itemCount&lt;br /&gt;
        W_new=C.wigth&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; item in t_i:&lt;br /&gt;
            &#039;&#039;&#039;if&#039;&#039;&#039; C_j.occ(item) = 0&lt;br /&gt;
                &#039;&#039;W_new = W_new + 1&lt;br /&gt;
        &#039;&#039;&#039;return&#039;&#039;&#039; S_new * (C.count+1) / (W_new ^ r) - (C.size * C.count) / (C.wigth ^ r)&lt;br /&gt;
&lt;br /&gt;
Вспомогательная функция &#039;&#039;&#039;DeltaRemove&#039;&#039;&#039;:&lt;br /&gt;
    &#039;&#039;&#039;function&#039;&#039;&#039; DeltaRemove(C,t,r)&lt;br /&gt;
        S_new=C.size - t.itemCount&lt;br /&gt;
        W_new=C.wigth&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; item in t:&lt;br /&gt;
            &#039;&#039;&#039;if&#039;&#039;&#039; C_j.occ(item) = 1&lt;br /&gt;
                &#039;&#039;W_new = W_new - 1&lt;br /&gt;
        &#039;&#039;&#039;return&#039;&#039;&#039; S_new * (C.count-1) / (W_new ^ r) - (C.size * C.count) / (C.wigth ^ r)&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В соответствии с ранее введенным обозначением &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - количество транзакций, &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - длина транзакции(максимальная), &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров.&lt;br /&gt;
&lt;br /&gt;
Основные вычисления восполняются в функции DeltaAdd/DeltaRemove: производится 1 сложение, не более &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; сложений/вычитаний, 2 умножения, 2 деления, 2 возведения в степень и 1 сложение - итого &amp;lt;math&amp;gt;m + 8&amp;lt;/math&amp;gt; операций. &lt;br /&gt;
&lt;br /&gt;
Операции выполняются для всех транзаций (&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; штук) и для всех кластеров (&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; штук). Итого выполняется &amp;lt;math&amp;gt;n*k*(m+8)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
В добавок к этому при добавлении/удалении транзакции к кластеру производится пересчет его характеристик: &amp;lt;math&amp;gt;m+2&amp;lt;/math&amp;gt; операции.&lt;br /&gt;
&lt;br /&gt;
Из того можно сделать вывод, что оценка сложность алгоритма равна &amp;lt;math&amp;gt;O(n*k*m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
На этапе инициализации при обработке каждой транзакции количество кластеров может как увеличиться, так и остаться неизменным. Это показано пунктирными линиями:&lt;br /&gt;
[[Файл:InitCLOPE.jpg|400px|center|Инициализация]]&lt;br /&gt;
На этапе итерации функции DeltaAdd/DeltaRemove могут считать параллельно для каждой транзакции&lt;br /&gt;
[[Файл:IterCLOPE.jpg ‎|400px|center|Итерации]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисление стоимости добавления/удаления транзакции, которые выполняются функциями DeltaAdd/DeltaRemove, происходит независимо для всех &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. Поэтому все вычисления можно производить параллельно. Таким образом сложность алгоритма с &amp;lt;math&amp;gt;O(n*k*m)&amp;lt;/math&amp;gt; понижается до &amp;lt;math&amp;gt;O(n*m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; транзакций длины &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и коэффициент отталкивания &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
метки классов для каждой транзакции в соответствии с проведенной кластеризацией(числовая последовательность длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности алгоритма определяется количеством кластеров: &amp;lt;math&amp;gt;\dfrac{O(n*k*m)}{O(n*m)} = k&amp;lt;/math&amp;gt;&lt;br /&gt;
* [[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] алгоритма равна &amp;lt;math&amp;gt;\dfrac{nk(m+8) + m + 2}{nm + n + 1} \cong k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Алгоритм не является [[глоссарий#Устойчивость|&#039;&#039;устойчивым&#039;&#039;]], так как результат работы зависит от порядка чтения транзакций и от текущего набора транзакций в кластере.&lt;br /&gt;
* Выполняется свойство сбалансированности операций между параллельными ветвями алгоритма, так как для каждой транзакции выполняются функции DeltaAdd/DeltaRemove, считающие стоимость добавления/удаления транзакции.&lt;br /&gt;
* Свойство [[глоссарий#Детерминированность|&#039;&#039;детерминированности алгоритмов&#039;&#039;]] не выполняется, так как результат алгоритма зависит от порядка прохождения транзакций. Но если рассматривать транзакции как нумерованный список, то результат будет определен однозначно от запуска к запуску. Однако существует расширение алгоритма, обеспечивающее свойство детерминированности. &amp;lt;ref&amp;gt;Li, Y., Le, J., Wang, M. Improving CLOPE’s Profit Value and Stability with an Optimized Agglomerative Approach. Algorithms 2015, 8, 380-394.&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;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* http://weka.sourceforge.net/doc.stable/weka/clusterers/CLOPE.html - реализация в open source библиотеке для анализа данных WEKA(Waikato Environment for Knowledge Analysis) на языке Java&lt;br /&gt;
Также существуют пользовательские реализации алгоритма:&lt;br /&gt;
* https://github.com/infozor/php_mysql_clustering_clope - реализация алгоритма на PHP&lt;br /&gt;
* https://github.com/Tolsi/scala-clope - реализация алгоритма Scala&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Boltonidze</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D0%BD%D0%B4%D1%80%D0%B5%D0%B9_%D0%A2%D1%83%D0%BC%D0%B0%D0%BD%D0%BE%D0%B2/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_CLOPE&amp;diff=16084</id>
		<title>Участник:Андрей Туманов/Алгоритм кластеризации категориальных данных CLOPE</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D0%BD%D0%B4%D1%80%D0%B5%D0%B9_%D0%A2%D1%83%D0%BC%D0%B0%D0%BD%D0%BE%D0%B2/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_CLOPE&amp;diff=16084"/>
		<updated>2016-11-07T21:10:22Z</updated>

		<summary type="html">&lt;p&gt;Boltonidze: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Андрей_Туманов|А.Л.Туманов]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Входные и выходные данные алгоритма|1.9]]), [[Участник:Александр_Александров|А.В.Александров]] ([[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]] [[#Существующие реализации алгоритма|2.7]])&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Алгоритм CLOPE (Clustering with sLOPE&amp;lt;ref&amp;gt;Yang, Y., Guan, H., You. J. CLOPE: A fast and Effective Clustering Algorithm for Transactional Data In Proc. of SIGKDD’02, July 23-26, 2002, Edmonton, Alberta, Canada.&amp;lt;/ref&amp;gt;) неирархический метод кластеризации, предназначенный для кластеризации огромных наборов категориальных данных. К достоинствам алгоритма относятся высокие масштабируемость и скорость работы и качество кластеризации, что достигается использованием глобального критерия оптимизации на основе максимизации градиента высоты гистограммы кластера. Отличается простотой программной реализации. &lt;br /&gt;
&lt;br /&gt;
Во время работы алгоритм хранит в памяти небольшое количество информации по каждому кластеру и требует минимальное число сканирований набора данных. CLOPE автоматически подбирает количество кластеров, причем это регулируется одним единственным параметром - коэффициентом отталкивания &amp;lt;math&amp;gt; r &amp;lt;/math&amp;gt;. При этом он обеспечивает более высокую производительность и лучшее качество кластеризации в сравнении с многими иерархическими алгоритмами.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть имеется база транзакций &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, состоящая из множества транзакций &amp;lt;math&amp;gt;\{t_1,t_2,...,t_n\}&amp;lt;/math&amp;gt;. Каждая транзакция есть набор объектов &amp;lt;math&amp;gt;\{i_1,...,i_m\}&amp;lt;/math&amp;gt;. Множество кластеров &amp;lt;math&amp;gt;\{C_1,...,C_k\}&amp;lt;/math&amp;gt; есть разбиение множества &amp;lt;math&amp;gt;\{t_1,...,t_n\}&amp;lt;/math&amp;gt;, такое, что &amp;lt;math&amp;gt;C_1 \cup \dots \cup C_k=\{t_1,...,t_n\}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_i \ne \empty&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_i \cap C_j = \empty &amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i \ge 1, k \ge j&amp;lt;/math&amp;gt;. Каждый элемент &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; называется кластером, а &amp;lt;math&amp;gt;n, m, k&amp;lt;/math&amp;gt; – количество транзакций, количество объектов в базе транзакций и число кластеров соответственно.&lt;br /&gt;
&lt;br /&gt;
Каждый кластер &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; имеет следующие характеристики:&lt;br /&gt;
[[Файл:ExampleCLOPE.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;math&amp;gt;D(C)&amp;lt;/math&amp;gt; – множество уникальных объектов;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Occ(i,C)&amp;lt;/math&amp;gt; – количество вхождений (частота) объекта &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; в кластер &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;S(C)= \sum_{i \in D(C)} Occ(i,C)= \sum_{t_i \in C}  \mid t_i  \mid , &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;W(C)=  \mid D(C) \mid ,H(C)=S(C)/W(C) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Функция стоимости:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Profit(C) = \frac{\sum^{k}_{i=1} G(C_i) \times \mid C_i \mid} {\sum^{k}_{i=1} \mid C_i \mid } = \frac{\sum^{k}_{i=1} \frac{S(C_i)}{W(C_i)^r} \times \mid C_i \mid} {\sum^{k}_{i=1} \mid C_i \mid }  &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\mid C_i \mid&amp;lt;/math&amp;gt;  количество объектов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; – количество кластеров, &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; – коэффициент отталкивания &amp;lt;math&amp;gt;(0 &amp;lt; r \le 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С помощью параметра &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; регулируется уровень сходства транзакций внутри кластера, и, как&lt;br /&gt;
следствие, финальное количество кластеров. Этот коэффициент подбирается пользователем. Чем больше &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, тем ниже уровень сходства и тем больше кластеров будет сгенерировано.&lt;br /&gt;
&lt;br /&gt;
Постановка задачи кластеризации алгоритмом CLOPE выглядит следующим образом: &lt;br /&gt;
&lt;br /&gt;
для заданных &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; найти разбиение &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; такое, что: &lt;br /&gt;
&amp;lt;math&amp;gt;Profit(C) \longrightarrow max &amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt;Нейский И.М. Классификация и сравнение методов кластеризации.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма состоит в вычислении на каждой итерации стоимости добавления и удаления транзакции из кластера: &lt;br /&gt;
&lt;br /&gt;
*вычисление нового размера кластера &amp;lt;math&amp;gt;S_{new}(C_i)=S(C_i) \pm \mid(t_n)\mid &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid(t_n)\mid&amp;lt;/math&amp;gt; - длина транзакции&lt;br /&gt;
&lt;br /&gt;
*вычисление новой ширины кластера &amp;lt;math&amp;gt;W_{new}(C_i)=\mid D(C_i \cup t_n)|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*вычисление стоимости &amp;lt;math&amp;gt;\frac{S_{new}(C_i)(\mid C_i \mid \pm 1)}{W_{new}(C_i)^r} - \frac{S(C_i) \mid C_i \mid }{W(C_i)^r}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из следующих этапов:&lt;br /&gt;
&lt;br /&gt;
1. &#039;&#039;&#039;Инициализация&#039;&#039;&#039;. На этом этапе происходит первый проход по таблице с транзакциями для построения начального разбиения, для каждой транзакции определяется кластер исходя из максимизации стоимости.&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;Итерация&#039;&#039;&#039;. На данном этапе для каждой транзакции проводится попытка перемещения в другой кластер для максимизации функции стоимости.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первая часть алгоритма - инициализация: для каждой транзакции вычисляется кластер, к которому она будет отнесена исходя из максимизации функции стоимости. Для этого вычисляется вспомогательная функция DeltaAdd, которая считает стоимость добавления транзакции к одному из существующих кластеров, либо к пустому. В итоге транзакция помещается в кластер, для которого цена добавления максимальна.&lt;br /&gt;
&lt;br /&gt;
Вторая часть алгоритма - уточняющие итерации: здесь происходит попытка улучшить вычисленные на первом этапе кластеры. В каждой итерации происходит перебор всех транзакций, и для каждой транзакции вычисляется цена удаления ее из текущего кластера и цена добавления в другой кластер. Суммарная стоимость перемещения будет являться суммой стоимостей удаления и добавления. Если максимальная стоимость перемещения данной транзакции в какой-либо больше нуля, то она перемещается в этот кластер. &lt;br /&gt;
&lt;br /&gt;
Вычисления происходят до тех пор, пока за итерацию происходит хотя бы одно перемещение транзакции. Если за итерацию не было произведено ни одного перемещения, то текущее состояние кластеров является устойчивым и оптимальным. &amp;lt;ref&amp;gt;Павлин Н. Кластеризация категорийных данных: масштабируемый алгоритм CLOPE, https://basegroup.ru/community/articles/clope&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Схема реализации на псевдокоде:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Входные параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; - транзакции&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - коэффициент отталкивания&lt;br /&gt;
&lt;br /&gt;
Выходной параметр:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; кластеры, в начале алгоритма - пустое множество&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация:&#039;&#039;&#039;&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; t_i in t:&lt;br /&gt;
    max = 0&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; C_j in C:&lt;br /&gt;
            &#039;&#039;&#039;if&#039;&#039;&#039; DeltaAdd(C_j,t_i,r) &amp;gt; max:&lt;br /&gt;
                max = DeltaAdd(C_j,t_i,r)&lt;br /&gt;
                C_best = C_j&lt;br /&gt;
    &#039;&#039;&#039;put&#039;&#039;&#039; t_i in C_best&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итерации:&#039;&#039;&#039;&lt;br /&gt;
    move = True&lt;br /&gt;
    &#039;&#039;&#039;while&#039;&#039;&#039; move == True:&lt;br /&gt;
    move = False&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; t_i in t:&lt;br /&gt;
            max = 0&lt;br /&gt;
            C_now = t_i.cluster&lt;br /&gt;
            removeCost = DeltaRemove(C_now,t_i,r)&lt;br /&gt;
            &#039;&#039;&#039;for&#039;&#039;&#039; C_j in C:&lt;br /&gt;
                &#039;&#039;&#039;if&#039;&#039;&#039; DeltaAdd(C_j,t_i,r) + removeCost &amp;gt; max:&lt;br /&gt;
                    max = DeltaAdd(C_j,t_i,r) + removeCost&lt;br /&gt;
                    C_best = C_j&lt;br /&gt;
        if max &amp;gt; 0&lt;br /&gt;
            &#039;&#039;&#039;del&#039;&#039;&#039; t_i from C_now&lt;br /&gt;
            &#039;&#039;&#039;put&#039;&#039;&#039; t_i in C_best&lt;br /&gt;
            move = True&lt;br /&gt;
&lt;br /&gt;
Вспомогательная функция &#039;&#039;&#039;DeltaAdd&#039;&#039;&#039;:&lt;br /&gt;
    &#039;&#039;&#039;function&#039;&#039;&#039; DeltaAdd(C,t,r)&lt;br /&gt;
        S_new=C.size + t.itemCount&lt;br /&gt;
        W_new=C.wigth&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; item in t_i:&lt;br /&gt;
            &#039;&#039;&#039;if&#039;&#039;&#039; C_j.occ(item) = 0&lt;br /&gt;
                &#039;&#039;W_new = W_new + 1&lt;br /&gt;
        &#039;&#039;&#039;return&#039;&#039;&#039; S_new * (C.count+1) / (W_new ^ r) - (C.size * C.count) / (C.wigth ^ r)&lt;br /&gt;
&lt;br /&gt;
Вспомогательная функция &#039;&#039;&#039;DeltaRemove&#039;&#039;&#039;:&lt;br /&gt;
    &#039;&#039;&#039;function&#039;&#039;&#039; DeltaRemove(C,t,r)&lt;br /&gt;
        S_new=C.size - t.itemCount&lt;br /&gt;
        W_new=C.wigth&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; item in t:&lt;br /&gt;
            &#039;&#039;&#039;if&#039;&#039;&#039; C_j.occ(item) = 1&lt;br /&gt;
                &#039;&#039;W_new = W_new - 1&lt;br /&gt;
        &#039;&#039;&#039;return&#039;&#039;&#039; S_new * (C.count-1) / (W_new ^ r) - (C.size * C.count) / (C.wigth ^ r)&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В соответствии с ранее введенным обозначением &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - количество транзакций, &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - длина транзакции(максимальная), &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров.&lt;br /&gt;
&lt;br /&gt;
Основные вычисления восполняются в функции DeltaAdd/DeltaRemove: производится 1 сложение, не более &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; сложений/вычитаний, 2 умножения, 2 деления, 2 возведения в степень и 1 сложение - итого &amp;lt;math&amp;gt;m + 8&amp;lt;/math&amp;gt; операций. &lt;br /&gt;
&lt;br /&gt;
Операции выполняются для всех транзаций (&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; штук) и для всех кластеров (&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; штук). Итого выполняется &amp;lt;math&amp;gt;n*k*(m+8)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
В добавок к этому при добавлении/удалении транзакции к кластеру производится пересчет его характеристик: &amp;lt;math&amp;gt;m+2&amp;lt;/math&amp;gt; операции.&lt;br /&gt;
&lt;br /&gt;
Из того можно сделать вывод, что оценка сложность алгоритма равна &amp;lt;math&amp;gt;O(n*k*m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
На этапе инициализации при обработке каждой транзакции количество кластеров может как увеличиться, так и остаться неизменным. Это показано пунктирными линиями:&lt;br /&gt;
[[Файл:InitCLOPE.jpg|400px|center|Инициализация]]&lt;br /&gt;
На этапе итерации функции DeltaAdd/DeltaRemove могут считать параллельно для каждой транзакции&lt;br /&gt;
[[Файл:IterCLOPE.jpg ‎|400px|center|Итерации]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисление стоимости добавления/удаления транзакции, которые выполняются функциями DeltaAdd/DeltaRemove, происходит независимо для всех &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. Поэтому все вычисления можно производить параллельно. Таким образом сложность алгоритма с &amp;lt;math&amp;gt;O(n*k*m)&amp;lt;/math&amp;gt; понижается до &amp;lt;math&amp;gt;O(n*m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; транзакций длины &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и коэффициент отталкивания &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
метки классов для каждой транзакции в соответствии с проведенной кластеризацией(числовая последовательность длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности алгоритма определяется количеством кластеров: &amp;lt;math&amp;gt;\dfrac{O(n*k*m)}{O(n*m)} = k&amp;lt;/math&amp;gt;&lt;br /&gt;
* [[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] алгоритма равна &amp;lt;math&amp;gt;\dfrac{nk(m+8) + m + 2}{nm + n + 1} \cong k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Алгоритм не является [[глоссарий#Устойчивость|&#039;&#039;устойчивым&#039;&#039;]], так как результат работы зависит от порядка чтения транзакций и от текущего набора транзакций в кластере.&lt;br /&gt;
* Выполняется свойство сбалансированности операций между параллельными ветвями алгоритма, так как для каждой транзакции выполняются функции DeltaAdd/DeltaRemove, считающие стоимость добавления/удаления транзакции.&lt;br /&gt;
* Свойство [[глоссарий#Детерминированность|&#039;&#039;детерминированности алгоритмов&#039;&#039;]] не выполняется, так как результат алгоритма зависит от порядка прохождения транзакций. Но если рассматривать транзакции как нумерованный список, то результат будет определен однозначно от запуска к запуску. Однако существует расширение алгоритма, обеспечивающее свойство детерминированности. &amp;lt;ref&amp;gt;Li, Y., Le, J., Wang, M. Improving CLOPE’s Profit Value and Stability with an Optimized Agglomerative Approach. Algorithms 2015, 8, 380-394.&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;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* http://weka.sourceforge.net/doc.stable/weka/clusterers/CLOPE.html - реализация в open source библиотеке для анализа данных WEKA(Waikato Environment for Knowledge Analysis) на языке Java&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Boltonidze</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D0%BD%D0%B4%D1%80%D0%B5%D0%B9_%D0%A2%D1%83%D0%BC%D0%B0%D0%BD%D0%BE%D0%B2/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_CLOPE&amp;diff=16083</id>
		<title>Участник:Андрей Туманов/Алгоритм кластеризации категориальных данных CLOPE</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D0%BD%D0%B4%D1%80%D0%B5%D0%B9_%D0%A2%D1%83%D0%BC%D0%B0%D0%BD%D0%BE%D0%B2/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_CLOPE&amp;diff=16083"/>
		<updated>2016-11-07T21:09:13Z</updated>

		<summary type="html">&lt;p&gt;Boltonidze: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Андрей_Туманов|А.Л.Туманов]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Входные и выходные данные алгоритма|1.9]]), [[Участник:Александр_Александров|А.В.Александров]] ([[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]] [[#Существующие реализации алгоритма|2.7]])&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Алгоритм CLOPE (Clustering with sLOPE&amp;lt;ref&amp;gt;Yang, Y., Guan, H., You. J. CLOPE: A fast and Effective Clustering Algorithm for Transactional Data In Proc. of SIGKDD’02, July 23-26, 2002, Edmonton, Alberta, Canada.&amp;lt;/ref&amp;gt;) неирархический метод кластеризации, предназначенный для кластеризации огромных наборов категориальных данных. К достоинствам алгоритма относятся высокие масштабируемость и скорость работы и качество кластеризации, что достигается использованием глобального критерия оптимизации на основе максимизации градиента высоты гистограммы кластера. Отличается простотой программной реализации. &lt;br /&gt;
&lt;br /&gt;
Во время работы алгоритм хранит в памяти небольшое количество информации по каждому кластеру и требует минимальное число сканирований набора данных. CLOPE автоматически подбирает количество кластеров, причем это регулируется одним единственным параметром - коэффициентом отталкивания &amp;lt;math&amp;gt; r &amp;lt;/math&amp;gt;. При этом он обеспечивает более высокую производительность и лучшее качество кластеризации в сравнении с многими иерархическими алгоритмами.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть имеется база транзакций &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, состоящая из множества транзакций &amp;lt;math&amp;gt;\{t_1,t_2,...,t_n\}&amp;lt;/math&amp;gt;. Каждая транзакция есть набор объектов &amp;lt;math&amp;gt;\{i_1,...,i_m\}&amp;lt;/math&amp;gt;. Множество кластеров &amp;lt;math&amp;gt;\{C_1,...,C_k\}&amp;lt;/math&amp;gt; есть разбиение множества &amp;lt;math&amp;gt;\{t_1,...,t_n\}&amp;lt;/math&amp;gt;, такое, что &amp;lt;math&amp;gt;C_1 \cup \dots \cup C_k=\{t_1,...,t_n\}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_i \ne \empty&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_i \cap C_j = \empty &amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i \ge 1, k \ge j&amp;lt;/math&amp;gt;. Каждый элемент &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; называется кластером, а &amp;lt;math&amp;gt;n, m, k&amp;lt;/math&amp;gt; – количество транзакций, количество объектов в базе транзакций и число кластеров соответственно.&lt;br /&gt;
&lt;br /&gt;
Каждый кластер &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; имеет следующие характеристики:&lt;br /&gt;
[[Файл:ExampleCLOPE.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;math&amp;gt;D(C)&amp;lt;/math&amp;gt; – множество уникальных объектов;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Occ(i,C)&amp;lt;/math&amp;gt; – количество вхождений (частота) объекта &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; в кластер &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;S(C)= \sum_{i \in D(C)} Occ(i,C)= \sum_{t_i \in C}  \mid t_i  \mid , &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;W(C)=  \mid D(C) \mid ,H(C)=S(C)/W(C) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Функция стоимости:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Profit(C) = \frac{\sum^{k}_{i=1} G(C_i) \times \mid C_i \mid} {\sum^{k}_{i=1} \mid C_i \mid } = \frac{\sum^{k}_{i=1} \frac{S(C_i)}{W(C_i)^r} \times \mid C_i \mid} {\sum^{k}_{i=1} \mid C_i \mid }  &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\mid C_i \mid&amp;lt;/math&amp;gt;  количество объектов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; – количество кластеров, &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; – коэффициент отталкивания &amp;lt;math&amp;gt;(0 &amp;lt; r \le 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С помощью параметра &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; регулируется уровень сходства транзакций внутри кластера, и, как&lt;br /&gt;
следствие, финальное количество кластеров. Этот коэффициент подбирается пользователем. Чем больше &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, тем ниже уровень сходства и тем больше кластеров будет сгенерировано.&lt;br /&gt;
&lt;br /&gt;
Постановка задачи кластеризации алгоритмом CLOPE выглядит следующим образом: &lt;br /&gt;
&lt;br /&gt;
для заданных &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; найти разбиение &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; такое, что: &lt;br /&gt;
&amp;lt;math&amp;gt;Profit(C) \longrightarrow max &amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt;Нейский И.М. Классификация и сравнение методов кластеризации.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма состоит в вычислении на каждой итерации стоимости добавления и удаления транзакции из кластера: &lt;br /&gt;
&lt;br /&gt;
*вычисление нового размера кластера &amp;lt;math&amp;gt;S_{new}(C_i)=S(C_i) \pm \mid(t_n)\mid &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid(t_n)\mid&amp;lt;/math&amp;gt; - длина транзакции&lt;br /&gt;
&lt;br /&gt;
*вычисление новой ширины кластера &amp;lt;math&amp;gt;W_{new}(C_i)=\mid D(C_i \cup t_n)|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*вычисление стоимости &amp;lt;math&amp;gt;\frac{S_{new}(C_i)(\mid C_i \mid \pm 1)}{W_{new}(C_i)^r} - \frac{S(C_i) \mid C_i \mid }{W(C_i)^r}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из следующих этапов:&lt;br /&gt;
&lt;br /&gt;
1. &#039;&#039;&#039;Инициализация&#039;&#039;&#039;. На этом этапе происходит первый проход по таблице с транзакциями для построения начального разбиения, для каждой транзакции определяется кластер исходя из максимизации стоимости.&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;Итерация&#039;&#039;&#039;. На данном этапе для каждой транзакции проводится попытка перемещения в другой кластер для максимизации функции стоимости.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первая часть алгоритма - инициализация: для каждой транзакции вычисляется кластер, к которому она будет отнесена исходя из максимизации функции стоимости. Для этого вычисляется вспомогательная функция DeltaAdd, которая считает стоимость добавления транзакции к одному из существующих кластеров, либо к пустому. В итоге транзакция помещается в кластер, для которого цена добавления максимальна.&lt;br /&gt;
&lt;br /&gt;
Вторая часть алгоритма - уточняющие итерации: здесь происходит попытка улучшить вычисленные на первом этапе кластеры. В каждой итерации происходит перебор всех транзакций, и для каждой транзакции вычисляется цена удаления ее из текущего кластера и цена добавления в другой кластер. Суммарная стоимость перемещения будет являться суммой стоимостей удаления и добавления. Если максимальная стоимость перемещения данной транзакции в какой-либо больше нуля, то она перемещается в этот кластер. &lt;br /&gt;
&lt;br /&gt;
Вычисления происходят до тех пор, пока за итерацию происходит хотя бы одно перемещение транзакции. Если за итерацию не было произведено ни одного перемещения, то текущее состояние кластеров является устойчивым и оптимальным. &amp;lt;ref&amp;gt;Павлин Н. Кластеризация категорийных данных: масштабируемый алгоритм CLOPE, https://basegroup.ru/community/articles/clope&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Схема реализации на псевдокоде:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Входные параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; - транзакции&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - коэффициент отталкивания&lt;br /&gt;
&lt;br /&gt;
Выходной параметр:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; кластеры, в начале алгоритма - пустое множество&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация:&#039;&#039;&#039;&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; t_i in t:&lt;br /&gt;
    max = 0&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; C_j in C:&lt;br /&gt;
            &#039;&#039;&#039;if&#039;&#039;&#039; DeltaAdd(C_j,t_i,r) &amp;gt; max:&lt;br /&gt;
                max = DeltaAdd(C_j,t_i,r)&lt;br /&gt;
                C_best = C_j&lt;br /&gt;
    &#039;&#039;&#039;put&#039;&#039;&#039; t_i in C_best&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итерации:&#039;&#039;&#039;&lt;br /&gt;
    move = True&lt;br /&gt;
    &#039;&#039;&#039;while&#039;&#039;&#039; move == True:&lt;br /&gt;
    move = False&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; t_i in t:&lt;br /&gt;
            max = 0&lt;br /&gt;
            C_now = t_i.cluster&lt;br /&gt;
            removeCost = DeltaRemove(C_now,t_i,r)&lt;br /&gt;
            &#039;&#039;&#039;for&#039;&#039;&#039; C_j in C:&lt;br /&gt;
                &#039;&#039;&#039;if&#039;&#039;&#039; DeltaAdd(C_j,t_i,r) + removeCost &amp;gt; max:&lt;br /&gt;
                    max = DeltaAdd(C_j,t_i,r) + removeCost&lt;br /&gt;
                    C_best = C_j&lt;br /&gt;
        if max &amp;gt; 0&lt;br /&gt;
            &#039;&#039;&#039;del&#039;&#039;&#039; t_i from C_now&lt;br /&gt;
            &#039;&#039;&#039;put&#039;&#039;&#039; t_i in C_best&lt;br /&gt;
            move = True&lt;br /&gt;
&lt;br /&gt;
Вспомогательная функция &#039;&#039;&#039;DeltaAdd&#039;&#039;&#039;:&lt;br /&gt;
    &#039;&#039;&#039;function&#039;&#039;&#039; DeltaAdd(C,t,r)&lt;br /&gt;
        S_new=C.size + t.itemCount&lt;br /&gt;
        W_new=C.wigth&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; item in t_i:&lt;br /&gt;
            &#039;&#039;&#039;if&#039;&#039;&#039; C_j.occ(item) = 0&lt;br /&gt;
                &#039;&#039;W_new = W_new + 1&lt;br /&gt;
        &#039;&#039;&#039;return&#039;&#039;&#039; S_new * (C.count+1) / (W_new ^ r) - (C.size * C.count) / (C.wigth ^ r)&lt;br /&gt;
&lt;br /&gt;
Вспомогательная функция &#039;&#039;&#039;DeltaRemove&#039;&#039;&#039;:&lt;br /&gt;
    &#039;&#039;&#039;function&#039;&#039;&#039; DeltaRemove(C,t,r)&lt;br /&gt;
        S_new=C.size - t.itemCount&lt;br /&gt;
        W_new=C.wigth&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; item in t:&lt;br /&gt;
            &#039;&#039;&#039;if&#039;&#039;&#039; C_j.occ(item) = 1&lt;br /&gt;
                &#039;&#039;W_new = W_new - 1&lt;br /&gt;
        &#039;&#039;&#039;return&#039;&#039;&#039; S_new * (C.count-1) / (W_new ^ r) - (C.size * C.count) / (C.wigth ^ r)&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В соответствии с ранее введенным обозначением &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - количество транзакций, &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - длина транзакции(максимальная), &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров.&lt;br /&gt;
&lt;br /&gt;
Основные вычисления восполняются в функции DeltaAdd/DeltaRemove: производится 1 сложение, не более &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; сложений/вычитаний, 2 умножения, 2 деления, 2 возведения в степень и 1 сложение - итого &amp;lt;math&amp;gt;m + 8&amp;lt;/math&amp;gt; операций. &lt;br /&gt;
&lt;br /&gt;
Операции выполняются для всех транзаций (&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; штук) и для всех кластеров (&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; штук). Итого выполняется &amp;lt;math&amp;gt;n*k*(m+8)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
В добавок к этому при добавлении/удалении транзакции к кластеру производится пересчет его характеристик: &amp;lt;math&amp;gt;m+2&amp;lt;/math&amp;gt; операции.&lt;br /&gt;
&lt;br /&gt;
Из того можно сделать вывод, что оценка сложность алгоритма равна &amp;lt;math&amp;gt;O(n*k*m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
На этапе инициализации при обработке каждой транзакции количество кластеров может как увеличиться, так и остаться неизменным. Это показано пунктирными линиями:&lt;br /&gt;
[[Файл:InitCLOPE.jpg|200px|thumb|left|alt text]]&lt;br /&gt;
На этапе итерации функции DeltaAdd/DeltaRemove могут считать параллельно для каждой транзакции&lt;br /&gt;
[[Файл:IterCLOPE.jpg ‎|200px|thumb|left|alt text]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисление стоимости добавления/удаления транзакции, которые выполняются функциями DeltaAdd/DeltaRemove, происходит независимо для всех &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. Поэтому все вычисления можно производить параллельно. Таким образом сложность алгоритма с &amp;lt;math&amp;gt;O(n*k*m)&amp;lt;/math&amp;gt; понижается до &amp;lt;math&amp;gt;O(n*m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; транзакций длины &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и коэффициент отталкивания &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
метки классов для каждой транзакции в соответствии с проведенной кластеризацией(числовая последовательность длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности алгоритма определяется количеством кластеров: &amp;lt;math&amp;gt;\dfrac{O(n*k*m)}{O(n*m)} = k&amp;lt;/math&amp;gt;&lt;br /&gt;
* [[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] алгоритма равна &amp;lt;math&amp;gt;\dfrac{nk(m+8) + m + 2}{nm + n + 1} \cong k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Алгоритм не является [[глоссарий#Устойчивость|&#039;&#039;устойчивым&#039;&#039;]], так как результат работы зависит от порядка чтения транзакций и от текущего набора транзакций в кластере.&lt;br /&gt;
* Выполняется свойство сбалансированности операций между параллельными ветвями алгоритма, так как для каждой транзакции выполняются функции DeltaAdd/DeltaRemove, считающие стоимость добавления/удаления транзакции.&lt;br /&gt;
* Свойство [[глоссарий#Детерминированность|&#039;&#039;детерминированности алгоритмов&#039;&#039;]] не выполняется, так как результат алгоритма зависит от порядка прохождения транзакций. Но если рассматривать транзакции как нумерованный список, то результат будет определен однозначно от запуска к запуску. Однако существует расширение алгоритма, обеспечивающее свойство детерминированности. &amp;lt;ref&amp;gt;Li, Y., Le, J., Wang, M. Improving CLOPE’s Profit Value and Stability with an Optimized Agglomerative Approach. Algorithms 2015, 8, 380-394.&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;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* http://weka.sourceforge.net/doc.stable/weka/clusterers/CLOPE.html - реализация в open source библиотеке для анализа данных WEKA(Waikato Environment for Knowledge Analysis) на языке Java&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Boltonidze</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D0%BD%D0%B4%D1%80%D0%B5%D0%B9_%D0%A2%D1%83%D0%BC%D0%B0%D0%BD%D0%BE%D0%B2/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_CLOPE&amp;diff=15894</id>
		<title>Участник:Андрей Туманов/Алгоритм кластеризации категориальных данных CLOPE</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D0%BD%D0%B4%D1%80%D0%B5%D0%B9_%D0%A2%D1%83%D0%BC%D0%B0%D0%BD%D0%BE%D0%B2/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_CLOPE&amp;diff=15894"/>
		<updated>2016-11-03T12:51:38Z</updated>

		<summary type="html">&lt;p&gt;Boltonidze: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Алгоритм CLOPE (Clustering with sLOPE&amp;lt;ref&amp;gt;Yang, Y., Guan, H., You. J. CLOPE: A fast and Effective Clustering Algorithm for Transactional Data In Proc. of SIGKDD’02, July 23-26, 2002, Edmonton, Alberta, Canada.&amp;lt;/ref&amp;gt;) неирархический метод кластеризации, предназначенный для кластеризации огромных наборов категориальных данных. К достоинствам алгоритма относятся высокие масштабируемость и скорость работы и качество кластеризации, что достигается использованием глобального критерия оптимизации на основе максимизации градиента высоты гистограммы кластера. Отличается простотой программной реализации. &lt;br /&gt;
&lt;br /&gt;
Во время работы алгоритм хранит в памяти небольшое количество информации по каждому кластеру и требует минимальное число сканирований набора данных. CLOPE автоматически подбирает количество кластеров, причем это регулируется одним единственным параметром - коэффициентом отталкивания &amp;lt;math&amp;gt; r &amp;lt;/math&amp;gt;. При этом он обеспечивает более высокую производительность и лучшее качество кластеризации в сравнении с многими иерархическими алгоритмами.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть имеется база транзакций &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, состоящая из множества транзакций &amp;lt;math&amp;gt;\{t_1,t_2,...,t_n\}&amp;lt;/math&amp;gt;. Каждая транзакция есть набор объектов &amp;lt;math&amp;gt;\{i_1,...,i_m\}&amp;lt;/math&amp;gt;. Множество кластеров &amp;lt;math&amp;gt;\{C_1,...,C_k\}&amp;lt;/math&amp;gt; есть разбиение множества &amp;lt;math&amp;gt;\{t_1,...,t_n\}&amp;lt;/math&amp;gt;, такое, что &amp;lt;math&amp;gt;C_1 \cup \dots \cup C_k=\{t_1,...,t_n\}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_i \ne \empty&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_i \cap C_j = \empty &amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i \ge 1, k \ge j&amp;lt;/math&amp;gt;. Каждый элемент &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; называется кластером, а &amp;lt;math&amp;gt;n, m, k&amp;lt;/math&amp;gt; – количество транзакций, количество объектов в базе транзакций и число кластеров соответственно.&lt;br /&gt;
&lt;br /&gt;
Каждый кластер &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; имеет следующие характеристики:&lt;br /&gt;
[[Файл:ExampleCLOPE.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;math&amp;gt;D(C)&amp;lt;/math&amp;gt; – множество уникальных объектов;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Occ(i,C)&amp;lt;/math&amp;gt; – количество вхождений (частота) объекта &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; в кластер &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;S(C)= \sum_{i \in D(C)} Occ(i,C)= \sum_{t_i \in C}  \mid t_i  \mid , &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;W(C)=  \mid D(C) \mid ,H(C)=S(C)/W(C) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Функция стоимости:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Profit(C) = \frac{\sum^{k}_{i=1} G(C_i) \times \mid C_i \mid} {\sum^{k}_{i=1} \mid C_i \mid } = \frac{\sum^{k}_{i=1} \frac{S(C_i)}{W(C_i)^r} \times \mid C_i \mid} {\sum^{k}_{i=1} \mid C_i \mid }  &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\mid C_i \mid&amp;lt;/math&amp;gt;  количество объектов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; – количество кластеров, &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; – коэффициент отталкивания &amp;lt;math&amp;gt;(0 &amp;lt; r \le 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С помощью параметра &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; регулируется уровень сходства транзакций внутри кластера, и, как&lt;br /&gt;
следствие, финальное количество кластеров. Этот коэффициент подбирается пользователем. Чем больше &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, тем ниже уровень сходства и тем больше кластеров будет сгенерировано.&lt;br /&gt;
&lt;br /&gt;
Постановка задачи кластеризации алгоритмом CLOPE выглядит следующим образом: &lt;br /&gt;
&lt;br /&gt;
для заданных &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; найти разбиение &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; такое, что: &lt;br /&gt;
&amp;lt;math&amp;gt;Profit(C) \longrightarrow max &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма состоит в вычислении на каждой итерации стоимости добавления и удаления транзакции из кластера: &lt;br /&gt;
&lt;br /&gt;
*вычисление нового размера кластера &amp;lt;math&amp;gt;S_{new}(C_i)=S(C_i) \pm \mid(t_n)\mid &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid(t_n)\mid&amp;lt;/math&amp;gt; - длина транзакции&lt;br /&gt;
&lt;br /&gt;
*вычисление новой ширины кластера &amp;lt;math&amp;gt;W_{new}(C_i)=\mid D(C_i \cup t_n)|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*вычисление стоимости &amp;lt;math&amp;gt;\frac{S_{new}(C_i)(\mid C_i \mid \pm 1)}{W_{new}(C_i)^r} - \frac{S(C_i) \mid C_i \mid }{W(C_i)^r}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из следующих этапов:&lt;br /&gt;
&lt;br /&gt;
1. &#039;&#039;&#039;Инициализация&#039;&#039;&#039;. На этом этапе происходит первый проход по таблице с транзакциями для построения начального разбиения, для каждой транзакции определяется кластер исходя из максимизации стоимости.&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;Итерация&#039;&#039;&#039;. На данном этапе для каждой транзакции проводится попытка перемещения в другой кластер для максимизации функции стоимости.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первая часть алгоритма - инициализация: для каждой транзакции вычисляется кластер, к которому она будет отнесена исходя из максимизации функции стоимости. Для этого вычисляется вспомогательная функция DeltaAdd, которая считает стоимость добавления транзакции к одному из существующих кластеров, либо к пустому. В итоге транзакция помещается в кластер, для которого цена добавления максимальна.&lt;br /&gt;
&lt;br /&gt;
Вторая часть алгоритма - уточняющие итерации: здесь происходит попытка улучшить вычисленные на первом этапе кластеры. В каждой итерации происходит перебор всех транзакций, и для каждой транзакции вычисляется цена удаления ее из текущего кластера и цена добавления в другой кластер. Суммарная стоимость перемещения будет являться суммой стоимостей удаления и добавления. Если максимальная стоимость перемещения данной транзакции в какой-либо больше нуля, то она перемещается в этот кластер. &lt;br /&gt;
&lt;br /&gt;
Вычисления происходят до тех пор, пока за итерацию происходит хотя бы одно перемещение транзакции. Если за итерацию не было произведено ни одного перемещения, то текущее состояние кластеров является устойчивым и оптимальным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Схема реализации на псевдокоде:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Входные параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; - транзакции&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - коэффициент отталкивания&lt;br /&gt;
&lt;br /&gt;
Выходной параметр:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; кластеры, в начале алгоритма - пустое множество&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация:&#039;&#039;&#039;&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; t_i in t:&lt;br /&gt;
    max = 0&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; C_j in C:&lt;br /&gt;
            &#039;&#039;&#039;if&#039;&#039;&#039; DeltaAdd(C_j,t_i,r) &amp;gt; max:&lt;br /&gt;
                max = DeltaAdd(C_j,t_i,r)&lt;br /&gt;
                C_best = C_j&lt;br /&gt;
    &#039;&#039;&#039;put&#039;&#039;&#039; t_i in C_best&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итерации:&#039;&#039;&#039;&lt;br /&gt;
    move = True&lt;br /&gt;
    &#039;&#039;&#039;while&#039;&#039;&#039; move == True:&lt;br /&gt;
    move = False&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; t_i in t:&lt;br /&gt;
            max = 0&lt;br /&gt;
            C_now = t_i.cluster&lt;br /&gt;
            removeCost = DeltaRemove(C_now,t_i,r)&lt;br /&gt;
            &#039;&#039;&#039;for&#039;&#039;&#039; C_j in C:&lt;br /&gt;
                &#039;&#039;&#039;if&#039;&#039;&#039; DeltaAdd(C_j,t_i,r) + removeCost &amp;gt; max:&lt;br /&gt;
                    max = DeltaAdd(C_j,t_i,r) + removeCost&lt;br /&gt;
                    C_best = C_j&lt;br /&gt;
        if max &amp;gt; 0&lt;br /&gt;
            &#039;&#039;&#039;del&#039;&#039;&#039; t_i from C_now&lt;br /&gt;
            &#039;&#039;&#039;put&#039;&#039;&#039; t_i in C_best&lt;br /&gt;
            move = True&lt;br /&gt;
&lt;br /&gt;
Вспомогательная функция &#039;&#039;&#039;DeltaAdd&#039;&#039;&#039;:&lt;br /&gt;
    &#039;&#039;&#039;function&#039;&#039;&#039; DeltaAdd(C,t,r)&lt;br /&gt;
        S_new=C.size + t.itemCount&lt;br /&gt;
        W_new=C.wigth&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; item in t_i:&lt;br /&gt;
            &#039;&#039;&#039;if&#039;&#039;&#039; C_j.occ(item) = 0&lt;br /&gt;
                &#039;&#039;W_new = W_new + 1&lt;br /&gt;
        &#039;&#039;&#039;return&#039;&#039;&#039; S_new * (C.count+1) / (W_new ^ r) - (C.size * C.count) / (C.wigth ^ r)&lt;br /&gt;
&lt;br /&gt;
Вспомогательная функция &#039;&#039;&#039;DeltaRemove&#039;&#039;&#039;:&lt;br /&gt;
    &#039;&#039;&#039;function&#039;&#039;&#039; DeltaRemove(C,t,r)&lt;br /&gt;
        S_new=C.size - t.itemCount&lt;br /&gt;
        W_new=C.wigth&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; item in t:&lt;br /&gt;
            &#039;&#039;&#039;if&#039;&#039;&#039; C_j.occ(item) = 1&lt;br /&gt;
                &#039;&#039;W_new = W_new - 1&lt;br /&gt;
        &#039;&#039;&#039;return&#039;&#039;&#039; S_new * (C.count-1) / (W_new ^ r) - (C.size * C.count) / (C.wigth ^ r)&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В соответствии с ранее введенным обозначением &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - количество транзакций, &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - длина транзакции(максимальная), &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров.&lt;br /&gt;
&lt;br /&gt;
Основные вычисления восполняются в функции DeltaAdd/DeltaRemove: производится 1 сложение, не более &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; сложений/вычитаний, 2 умножения, 2 деления, 2 возведения в степень и 1 сложение - итого &amp;lt;math&amp;gt;m + 8&amp;lt;/math&amp;gt; операций. &lt;br /&gt;
&lt;br /&gt;
Операции выполняются для всех транзаций (&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; штук) и для всех кластеров (&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; штук). Итого выполняется &amp;lt;math&amp;gt;n*k*(m+8)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
В добавок к этому при добавлении/удалении транзакции к кластеру производится пересчет его характеристик: &amp;lt;math&amp;gt;m+2&amp;lt;/math&amp;gt; операции.&lt;br /&gt;
&lt;br /&gt;
Из того можно сделать вывод, что оценка сложность алгоритма равна &amp;lt;math&amp;gt;O(n*k*m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисление стоимости добавления/удаления транзакции, которые выполняются функциями DeltaAdd/DeltaRemove, происходит независимо для всех &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. Поэтому все вычисления можно производить параллельно. Таким образом сложность алгоритма с &amp;lt;math&amp;gt;O(n*k*m)&amp;lt;/math&amp;gt; понижается до &amp;lt;math&amp;gt;O(n*m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; транзакций длины &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и коэффициент отталкивания &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
метки классов для каждой транзакции в соответствии с проведенной кластеризацией(числовая последовательность длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности алгоритма определяется количеством кластеров: &amp;lt;math&amp;gt;\dfrac{O(n*k*m)}{O(n*m)} = k&amp;lt;/math&amp;gt;&lt;br /&gt;
* [[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] алгоритма равна &amp;lt;math&amp;gt;\dfrac{nk(m+8) + m + 2}{nm + n + 1} \cong k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Алгоритм не является [[глоссарий#Устойчивость|&#039;&#039;устойчивым&#039;&#039;]], так как результат работы зависит от порядка чтения транзакций и от текущего набора транзакций в кластере.&lt;br /&gt;
* Выполняется свойство сбалансированности операций между параллельными ветвями алгоритма, так как для каждой транзакции выполняются функции DeltaAdd/DeltaRemove, считающие стоимость добавления/удаления транзакции.&lt;br /&gt;
* Свойство [[глоссарий#Детерминированность|&#039;&#039;детерминированности алгоритмов&#039;&#039;]] не выполняется, так как результат алгоритма зависит от порядка прохождения транзакций. Но если рассматривать транзакции как нумерованный список, то результат будет определен однозначно от запуска к запуску. Однако существует расширение алгоритма, обеспечивающее свойство детерминированности. &amp;lt;ref&amp;gt;Li, Y., Le, J., Wang, M. Improving CLOPE’s Profit Value and Stability with an Optimized Agglomerative Approach. Algorithms 2015, 8, 380-394.&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;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* http://weka.sourceforge.net/doc.stable/weka/clusterers/CLOPE.html - реализация в open source библиотеке для анализа данных WEKA(Waikato Environment for Knowledge Analysis) на языке Java&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[2] Нейский И.М. Классификация и сравнение методов кластеризации&lt;br /&gt;
&lt;br /&gt;
[3] Павлин Н. Кластеризация категорийных данных: масштабируемый алгоритм CLOPE, https://basegroup.ru/community/articles/clope&lt;br /&gt;
&lt;br /&gt;
[4] Філонова О.О., Вороной С.М.. Алгоритм кластеризации поискових профилей пользователей для системы персонализации сайта, http://masters.donntu.org/2014/fknt/filonova/library/article2.htm&lt;/div&gt;</summary>
		<author><name>Boltonidze</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D0%BD%D0%B4%D1%80%D0%B5%D0%B9_%D0%A2%D1%83%D0%BC%D0%B0%D0%BD%D0%BE%D0%B2/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_CLOPE&amp;diff=15893</id>
		<title>Участник:Андрей Туманов/Алгоритм кластеризации категориальных данных CLOPE</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D0%BD%D0%B4%D1%80%D0%B5%D0%B9_%D0%A2%D1%83%D0%BC%D0%B0%D0%BD%D0%BE%D0%B2/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_CLOPE&amp;diff=15893"/>
		<updated>2016-11-03T12:50:55Z</updated>

		<summary type="html">&lt;p&gt;Boltonidze: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Алгоритм CLOPE (Clustering with sLOPE&amp;lt;ref&amp;gt;Yang, Y., Guan, H., You. J. CLOPE: A fast and Effective Clustering Algorithm for Transactional Data In Proc. of SIGKDD’02, July 23-26, 2002, Edmonton, Alberta, Canada.&amp;lt;/ref&amp;gt;) неирархический метод кластеризации, предназначенный для кластеризации огромных наборов категориальных данных. К достоинствам алгоритма относятся высокие масштабируемость и скорость работы и качество кластеризации, что достигается использованием глобального критерия оптимизации на основе максимизации градиента высоты гистограммы кластера. Отличается простотой программной реализации. &lt;br /&gt;
&lt;br /&gt;
Во время работы алгоритм хранит в памяти небольшое количество информации по каждому кластеру и требует минимальное число сканирований набора данных. CLOPE автоматически подбирает количество кластеров, причем это регулируется одним единственным параметром - коэффициентом отталкивания &amp;lt;math&amp;gt; r &amp;lt;/math&amp;gt;. При этом он обеспечивает более высокую производительность и лучшее качество кластеризации в сравнении с многими иерархическими алгоритмами.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть имеется база транзакций &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, состоящая из множества транзакций &amp;lt;math&amp;gt;\{t_1,t_2,...,t_n\}&amp;lt;/math&amp;gt;. Каждая транзакция есть набор объектов &amp;lt;math&amp;gt;\{i_1,...,i_m\}&amp;lt;/math&amp;gt;. Множество кластеров &amp;lt;math&amp;gt;\{C_1,...,C_k\}&amp;lt;/math&amp;gt; есть разбиение множества &amp;lt;math&amp;gt;\{t_1,...,t_n\}&amp;lt;/math&amp;gt;, такое, что &amp;lt;math&amp;gt;C_1 \cup \dots \cup C_k=\{t_1,...,t_n\}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_i \ne \empty&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_i \cap C_j = \empty &amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i \ge 1, k \ge j&amp;lt;/math&amp;gt;. Каждый элемент &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; называется кластером, а &amp;lt;math&amp;gt;n, m, k&amp;lt;/math&amp;gt; – количество транзакций, количество объектов в базе транзакций и число кластеров соответственно.&lt;br /&gt;
&lt;br /&gt;
Каждый кластер &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; имеет следующие характеристики:&lt;br /&gt;
[[Файл:ExampleCLOPE.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;math&amp;gt;D(C)&amp;lt;/math&amp;gt; – множество уникальных объектов;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Occ(i,C)&amp;lt;/math&amp;gt; – количество вхождений (частота) объекта &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; в кластер &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;S(C)= \sum_{i \in D(C)} Occ(i,C)= \sum_{t_i \in C}  \mid t_i  \mid , &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;W(C)=  \mid D(C) \mid ,H(C)=S(C)/W(C) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Функция стоимости:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Profit(C) = \frac{\sum^{k}_{i=1} G(C_i) \times \mid C_i \mid} {\sum^{k}_{i=1} \mid C_i \mid } = \frac{\sum^{k}_{i=1} \frac{S(C_i)}{W(C_i)^r} \times \mid C_i \mid} {\sum^{k}_{i=1} \mid C_i \mid }  &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\mid C_i \mid&amp;lt;/math&amp;gt;  количество объектов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; – количество кластеров, &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; – коэффициент отталкивания &amp;lt;math&amp;gt;(0 &amp;lt; r \le 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С помощью параметра &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; регулируется уровень сходства транзакций внутри кластера, и, как&lt;br /&gt;
следствие, финальное количество кластеров. Этот коэффициент подбирается пользователем. Чем больше &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, тем ниже уровень сходства и тем больше кластеров будет сгенерировано.&lt;br /&gt;
&lt;br /&gt;
Постановка задачи кластеризации алгоритмом CLOPE выглядит следующим образом: &lt;br /&gt;
&lt;br /&gt;
для заданных &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; найти разбиение &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; такое, что: &lt;br /&gt;
&amp;lt;math&amp;gt;Profit(C) \longrightarrow max &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма состоит в вычислении на каждой итерации стоимости добавления и удаления транзакции из кластера: &lt;br /&gt;
&lt;br /&gt;
*вычисление нового размера кластера &amp;lt;math&amp;gt;S_{new}(C_i)=S(C_i) \pm \mid(t_n)\mid &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid(t_n)\mid&amp;lt;/math&amp;gt; - длина транзакции&lt;br /&gt;
&lt;br /&gt;
*вычисление новой ширины кластера &amp;lt;math&amp;gt;W_{new}(C_i)=\mid D(C_i \cup t_n)|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*вычисление стоимости &amp;lt;math&amp;gt;\frac{S_{new}(C_i)(\mid C_i \mid \pm 1)}{W_{new}(C_i)^r} - \frac{S(C_i) \mid C_i \mid }{W(C_i)^r}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из следующих этапов:&lt;br /&gt;
&lt;br /&gt;
1. &#039;&#039;&#039;Инициализация&#039;&#039;&#039;. На этом этапе происходит первый проход по таблице с транзакциями для построения начального разбиения, для каждой транзакции определяется кластер исходя из максимизации стоимости.&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;Итерация&#039;&#039;&#039;. На данном этапе для каждой транзакции проводится попытка перемещения в другой кластер для максимизации функции стоимости.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первая часть алгоритма - инициализация: для каждой транзакции вычисляется кластер, к которому она будет отнесена исходя из максимизации функции стоимости. Для этого вычисляется вспомогательная функция DeltaAdd, которая считает стоимость добавления транзакции к одному из существующих кластеров, либо к пустому. В итоге транзакция помещается в кластер, для которого цена добавления максимальна.&lt;br /&gt;
&lt;br /&gt;
Вторая часть алгоритма - уточняющие итерации: здесь происходит попытка улучшить вычисленные на первом этапе кластеры. В каждой итерации происходит перебор всех транзакций, и для каждой транзакции вычисляется цена удаления ее из текущего кластера и цена добавления в другой кластер. Суммарная стоимость перемещения будет являться суммой стоимостей удаления и добавления. Если максимальная стоимость перемещения данной транзакции в какой-либо больше нуля, то она перемещается в этот кластер. &lt;br /&gt;
&lt;br /&gt;
Вычисления происходят до тех пор, пока за итерацию происходит хотя бы одно перемещение транзакции. Если за итерацию не было произведено ни одного перемещения, то текущее состояние кластеров является устойчивым и оптимальным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Схема реализации на псевдокоде:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Входные параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; - транзакции&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - коэффициент отталкивания&lt;br /&gt;
&lt;br /&gt;
Выходной параметр:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; кластеры, в начале алгоритма - пустое множество&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация:&#039;&#039;&#039;&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; t_i in t:&lt;br /&gt;
    max = 0&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; C_j in C:&lt;br /&gt;
            &#039;&#039;&#039;if&#039;&#039;&#039; DeltaAdd(C_j,t_i,r) &amp;gt; max:&lt;br /&gt;
                max = DeltaAdd(C_j,t_i,r)&lt;br /&gt;
                C_best = C_j&lt;br /&gt;
    &#039;&#039;&#039;put&#039;&#039;&#039; t_i in C_best&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итерации:&#039;&#039;&#039;&lt;br /&gt;
    move = True&lt;br /&gt;
    &#039;&#039;&#039;while&#039;&#039;&#039; move == True:&lt;br /&gt;
    move = False&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; t_i in t:&lt;br /&gt;
            max = 0&lt;br /&gt;
            C_now = t_i.cluster&lt;br /&gt;
            removeCost = DeltaRemove(C_now,t_i,r)&lt;br /&gt;
            &#039;&#039;&#039;for&#039;&#039;&#039; C_j in C:&lt;br /&gt;
                &#039;&#039;&#039;if&#039;&#039;&#039; DeltaAdd(C_j,t_i,r) + removeCost &amp;gt; max:&lt;br /&gt;
                    max = DeltaAdd(C_j,t_i,r) + removeCost&lt;br /&gt;
                    C_best = C_j&lt;br /&gt;
        if max &amp;gt; 0&lt;br /&gt;
            &#039;&#039;&#039;del&#039;&#039;&#039; t_i from C_now&lt;br /&gt;
            &#039;&#039;&#039;put&#039;&#039;&#039; t_i in C_best&lt;br /&gt;
            move = True&lt;br /&gt;
&lt;br /&gt;
Вспомогательная функция &#039;&#039;&#039;DeltaAdd&#039;&#039;&#039;:&lt;br /&gt;
    &#039;&#039;&#039;function&#039;&#039;&#039; DeltaAdd(C,t,r)&lt;br /&gt;
        S_new=C.size + t.itemCount&lt;br /&gt;
        W_new=C.wigth&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; item in t_i:&lt;br /&gt;
            &#039;&#039;&#039;if&#039;&#039;&#039; C_j.occ(item) = 0&lt;br /&gt;
                &#039;&#039;W_new = W_new + 1&lt;br /&gt;
        &#039;&#039;&#039;return&#039;&#039;&#039; S_new * (C.count+1) / (W_new ^ r) - (C.size * C.count) / (C.wigth ^ r)&lt;br /&gt;
&lt;br /&gt;
Вспомогательная функция &#039;&#039;&#039;DeltaRemove&#039;&#039;&#039;:&lt;br /&gt;
    &#039;&#039;&#039;function&#039;&#039;&#039; DeltaRemove(C,t,r)&lt;br /&gt;
        S_new=C.size - t.itemCount&lt;br /&gt;
        W_new=C.wigth&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; item in t:&lt;br /&gt;
            &#039;&#039;&#039;if&#039;&#039;&#039; C_j.occ(item) = 1&lt;br /&gt;
                &#039;&#039;W_new = W_new - 1&lt;br /&gt;
        &#039;&#039;&#039;return&#039;&#039;&#039; S_new * (C.count-1) / (W_new ^ r) - (C.size * C.count) / (C.wigth ^ r)&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В соответствии с ранее введенным обозначением &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - количество транзакций, &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - длина транзакции(максимальная), &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров.&lt;br /&gt;
&lt;br /&gt;
Основные вычисления восполняются в функции DeltaAdd/DeltaRemove: производится 1 сложение, не более &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; сложений/вычитаний, 2 умножения, 2 деления, 2 возведения в степень и 1 сложение - итого &amp;lt;math&amp;gt;m + 8&amp;lt;/math&amp;gt; операций. &lt;br /&gt;
&lt;br /&gt;
Операции выполняются для всех транзаций (&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; штук) и для всех кластеров (&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; штук). Итого выполняется &amp;lt;math&amp;gt;n*k*(m+8)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
В добавок к этому при добавлении/удалении транзакции к кластеру производится пересчет его характеристик: &amp;lt;math&amp;gt;m+2&amp;lt;/math&amp;gt; операции.&lt;br /&gt;
&lt;br /&gt;
Из того можно сделать вывод, что оценка сложность алгоритма равна &amp;lt;math&amp;gt;O(n*k*m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисление стоимости добавления/удаления транзакции, которые выполняются функциями DeltaAdd/DeltaRemove, происходит независимо для всех &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. Поэтому все вычисления можно производить параллельно. Таким образом сложность алгоритма с &amp;lt;math&amp;gt;O(n*k*m)&amp;lt;/math&amp;gt; понижается до &amp;lt;math&amp;gt;O(n*m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; транзакций длины &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и коэффициент отталкивания &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
метки классов для каждой транзакции в соответствии с проведенной кластеризацией(числовая последовательность длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности алгоритма определяется количеством кластеров: &amp;lt;math&amp;gt;\dfrac{O(n*k*m)}{O(n*m)} = k&amp;lt;/math&amp;gt;&lt;br /&gt;
* [[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] алгоритма равна &amp;lt;math&amp;gt;\dfrac{nk(m+8) + m + 2}{nm + n + 1} \cong k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Алгоритм не является [[глоссарий#Устойчивость|&#039;&#039;устойчивым&#039;&#039;]], так как результат работы зависит от порядка чтения транзакций и от текущего набора транзакций в кластере.&lt;br /&gt;
* Выполняется свойство сбалансированности операций между параллельными ветвями алгоритма, так как для каждой транзакции выполняются функции DeltaAdd/DeltaRemove, считающие стоимость добавления/удаления транзакции.&lt;br /&gt;
* Свойство [[глоссарий#Детерминированность|&#039;&#039;детерминированности алгоритмов&#039;&#039;]] не выполняется, так как результат алгоритма зависит от порядка прохождения транзакций. Но если рассматривать транзакции как нумерованный список, то результат будет определен однозначно от запуска к запуску. Однако существует расширение алгоритма, обеспечивающее свойство детерминированности. &amp;lt;ref&amp;gt;Li, Y., Le, J., Wang, M. Improving CLOPE’s Profit Value and Stability with an Optimized Agglomerative Approach. Algorithms 2015, 8, 380-394.&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;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* http://weka.sourceforge.net/doc.stable/weka/clusterers/CLOPE.html - реализация в open source библиотеке для анализа данных WEKA(Waikato Environment for Knowledge Analysis) на языке Java&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Yang, Y., Guan, H., You. J. CLOPE: A fast and Effective Clustering Algorithm for Transactional Data In Proc. of SIGKDD’02, July 23-26, 2002, Edmonton, Alberta, Canada.&lt;br /&gt;
&lt;br /&gt;
[2] Нейский И.М. Классификация и сравнение методов кластеризации&lt;br /&gt;
&lt;br /&gt;
[3] Павлин Н. Кластеризация категорийных данных: масштабируемый алгоритм CLOPE, https://basegroup.ru/community/articles/clope&lt;br /&gt;
&lt;br /&gt;
[4] Філонова О.О., Вороной С.М.. Алгоритм кластеризации поискових профилей пользователей для системы персонализации сайта, http://masters.donntu.org/2014/fknt/filonova/library/article2.htm&lt;/div&gt;</summary>
		<author><name>Boltonidze</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D0%BD%D0%B4%D1%80%D0%B5%D0%B9_%D0%A2%D1%83%D0%BC%D0%B0%D0%BD%D0%BE%D0%B2/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_CLOPE&amp;diff=15892</id>
		<title>Участник:Андрей Туманов/Алгоритм кластеризации категориальных данных CLOPE</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D0%BD%D0%B4%D1%80%D0%B5%D0%B9_%D0%A2%D1%83%D0%BC%D0%B0%D0%BD%D0%BE%D0%B2/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_CLOPE&amp;diff=15892"/>
		<updated>2016-11-03T12:49:27Z</updated>

		<summary type="html">&lt;p&gt;Boltonidze: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Алгоритм CLOPE (Clustering with sLOPE) неирархический метод кластеризации, предназначенный для кластеризации огромных наборов категориальных данных. К достоинствам алгоритма относятся высокие масштабируемость и скорость работы и качество кластеризации, что достигается использованием глобального критерия оптимизации на основе максимизации градиента высоты гистограммы кластера. Отличается простотой программной реализации. &lt;br /&gt;
&lt;br /&gt;
Во время работы алгоритм хранит в памяти небольшое количество информации по каждому кластеру и требует минимальное число сканирований набора данных. CLOPE автоматически подбирает количество кластеров, причем это регулируется одним единственным параметром - коэффициентом отталкивания &amp;lt;math&amp;gt; r &amp;lt;/math&amp;gt;. При этом он обеспечивает более высокую производительность и лучшее качество кластеризации в сравнении с многими иерархическими алгоритмами.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть имеется база транзакций &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, состоящая из множества транзакций &amp;lt;math&amp;gt;\{t_1,t_2,...,t_n\}&amp;lt;/math&amp;gt;. Каждая транзакция есть набор объектов &amp;lt;math&amp;gt;\{i_1,...,i_m\}&amp;lt;/math&amp;gt;. Множество кластеров &amp;lt;math&amp;gt;\{C_1,...,C_k\}&amp;lt;/math&amp;gt; есть разбиение множества &amp;lt;math&amp;gt;\{t_1,...,t_n\}&amp;lt;/math&amp;gt;, такое, что &amp;lt;math&amp;gt;C_1 \cup \dots \cup C_k=\{t_1,...,t_n\}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_i \ne \empty&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_i \cap C_j = \empty &amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i \ge 1, k \ge j&amp;lt;/math&amp;gt;. Каждый элемент &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; называется кластером, а &amp;lt;math&amp;gt;n, m, k&amp;lt;/math&amp;gt; – количество транзакций, количество объектов в базе транзакций и число кластеров соответственно.&lt;br /&gt;
&lt;br /&gt;
Каждый кластер &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; имеет следующие характеристики:&lt;br /&gt;
[[Файл:ExampleCLOPE.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;math&amp;gt;D(C)&amp;lt;/math&amp;gt; – множество уникальных объектов;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Occ(i,C)&amp;lt;/math&amp;gt; – количество вхождений (частота) объекта &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; в кластер &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;S(C)= \sum_{i \in D(C)} Occ(i,C)= \sum_{t_i \in C}  \mid t_i  \mid , &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;W(C)=  \mid D(C) \mid ,H(C)=S(C)/W(C) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Функция стоимости:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Profit(C) = \frac{\sum^{k}_{i=1} G(C_i) \times \mid C_i \mid} {\sum^{k}_{i=1} \mid C_i \mid } = \frac{\sum^{k}_{i=1} \frac{S(C_i)}{W(C_i)^r} \times \mid C_i \mid} {\sum^{k}_{i=1} \mid C_i \mid }  &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\mid C_i \mid&amp;lt;/math&amp;gt;  количество объектов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; – количество кластеров, &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; – коэффициент отталкивания &amp;lt;math&amp;gt;(0 &amp;lt; r \le 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С помощью параметра &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; регулируется уровень сходства транзакций внутри кластера, и, как&lt;br /&gt;
следствие, финальное количество кластеров. Этот коэффициент подбирается пользователем. Чем больше &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, тем ниже уровень сходства и тем больше кластеров будет сгенерировано.&lt;br /&gt;
&lt;br /&gt;
Постановка задачи кластеризации алгоритмом CLOPE выглядит следующим образом: &lt;br /&gt;
&lt;br /&gt;
для заданных &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; найти разбиение &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; такое, что: &lt;br /&gt;
&amp;lt;math&amp;gt;Profit(C) \longrightarrow max &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма состоит в вычислении на каждой итерации стоимости добавления и удаления транзакции из кластера: &lt;br /&gt;
&lt;br /&gt;
*вычисление нового размера кластера &amp;lt;math&amp;gt;S_{new}(C_i)=S(C_i) \pm \mid(t_n)\mid &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid(t_n)\mid&amp;lt;/math&amp;gt; - длина транзакции&lt;br /&gt;
&lt;br /&gt;
*вычисление новой ширины кластера &amp;lt;math&amp;gt;W_{new}(C_i)=\mid D(C_i \cup t_n)|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*вычисление стоимости &amp;lt;math&amp;gt;\frac{S_{new}(C_i)(\mid C_i \mid \pm 1)}{W_{new}(C_i)^r} - \frac{S(C_i) \mid C_i \mid }{W(C_i)^r}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из следующих этапов:&lt;br /&gt;
&lt;br /&gt;
1. &#039;&#039;&#039;Инициализация&#039;&#039;&#039;. На этом этапе происходит первый проход по таблице с транзакциями для построения начального разбиения, для каждой транзакции определяется кластер исходя из максимизации стоимости.&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;Итерация&#039;&#039;&#039;. На данном этапе для каждой транзакции проводится попытка перемещения в другой кластер для максимизации функции стоимости.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первая часть алгоритма - инициализация: для каждой транзакции вычисляется кластер, к которому она будет отнесена исходя из максимизации функции стоимости. Для этого вычисляется вспомогательная функция DeltaAdd, которая считает стоимость добавления транзакции к одному из существующих кластеров, либо к пустому. В итоге транзакция помещается в кластер, для которого цена добавления максимальна.&lt;br /&gt;
&lt;br /&gt;
Вторая часть алгоритма - уточняющие итерации: здесь происходит попытка улучшить вычисленные на первом этапе кластеры. В каждой итерации происходит перебор всех транзакций, и для каждой транзакции вычисляется цена удаления ее из текущего кластера и цена добавления в другой кластер. Суммарная стоимость перемещения будет являться суммой стоимостей удаления и добавления. Если максимальная стоимость перемещения данной транзакции в какой-либо больше нуля, то она перемещается в этот кластер. &lt;br /&gt;
&lt;br /&gt;
Вычисления происходят до тех пор, пока за итерацию происходит хотя бы одно перемещение транзакции. Если за итерацию не было произведено ни одного перемещения, то текущее состояние кластеров является устойчивым и оптимальным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Схема реализации на псевдокоде:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Входные параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; - транзакции&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - коэффициент отталкивания&lt;br /&gt;
&lt;br /&gt;
Выходной параметр:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; кластеры, в начале алгоритма - пустое множество&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация:&#039;&#039;&#039;&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; t_i in t:&lt;br /&gt;
    max = 0&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; C_j in C:&lt;br /&gt;
            &#039;&#039;&#039;if&#039;&#039;&#039; DeltaAdd(C_j,t_i,r) &amp;gt; max:&lt;br /&gt;
                max = DeltaAdd(C_j,t_i,r)&lt;br /&gt;
                C_best = C_j&lt;br /&gt;
    &#039;&#039;&#039;put&#039;&#039;&#039; t_i in C_best&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итерации:&#039;&#039;&#039;&lt;br /&gt;
    move = True&lt;br /&gt;
    &#039;&#039;&#039;while&#039;&#039;&#039; move == True:&lt;br /&gt;
    move = False&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; t_i in t:&lt;br /&gt;
            max = 0&lt;br /&gt;
            C_now = t_i.cluster&lt;br /&gt;
            removeCost = DeltaRemove(C_now,t_i,r)&lt;br /&gt;
            &#039;&#039;&#039;for&#039;&#039;&#039; C_j in C:&lt;br /&gt;
                &#039;&#039;&#039;if&#039;&#039;&#039; DeltaAdd(C_j,t_i,r) + removeCost &amp;gt; max:&lt;br /&gt;
                    max = DeltaAdd(C_j,t_i,r) + removeCost&lt;br /&gt;
                    C_best = C_j&lt;br /&gt;
        if max &amp;gt; 0&lt;br /&gt;
            &#039;&#039;&#039;del&#039;&#039;&#039; t_i from C_now&lt;br /&gt;
            &#039;&#039;&#039;put&#039;&#039;&#039; t_i in C_best&lt;br /&gt;
            move = True&lt;br /&gt;
&lt;br /&gt;
Вспомогательная функция &#039;&#039;&#039;DeltaAdd&#039;&#039;&#039;:&lt;br /&gt;
    &#039;&#039;&#039;function&#039;&#039;&#039; DeltaAdd(C,t,r)&lt;br /&gt;
        S_new=C.size + t.itemCount&lt;br /&gt;
        W_new=C.wigth&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; item in t_i:&lt;br /&gt;
            &#039;&#039;&#039;if&#039;&#039;&#039; C_j.occ(item) = 0&lt;br /&gt;
                &#039;&#039;W_new = W_new + 1&lt;br /&gt;
        &#039;&#039;&#039;return&#039;&#039;&#039; S_new * (C.count+1) / (W_new ^ r) - (C.size * C.count) / (C.wigth ^ r)&lt;br /&gt;
&lt;br /&gt;
Вспомогательная функция &#039;&#039;&#039;DeltaRemove&#039;&#039;&#039;:&lt;br /&gt;
    &#039;&#039;&#039;function&#039;&#039;&#039; DeltaRemove(C,t,r)&lt;br /&gt;
        S_new=C.size - t.itemCount&lt;br /&gt;
        W_new=C.wigth&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; item in t:&lt;br /&gt;
            &#039;&#039;&#039;if&#039;&#039;&#039; C_j.occ(item) = 1&lt;br /&gt;
                &#039;&#039;W_new = W_new - 1&lt;br /&gt;
        &#039;&#039;&#039;return&#039;&#039;&#039; S_new * (C.count-1) / (W_new ^ r) - (C.size * C.count) / (C.wigth ^ r)&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В соответствии с ранее введенным обозначением &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - количество транзакций, &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - длина транзакции(максимальная), &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров.&lt;br /&gt;
&lt;br /&gt;
Основные вычисления восполняются в функции DeltaAdd/DeltaRemove: производится 1 сложение, не более &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; сложений/вычитаний, 2 умножения, 2 деления, 2 возведения в степень и 1 сложение - итого &amp;lt;math&amp;gt;m + 8&amp;lt;/math&amp;gt; операций. &lt;br /&gt;
&lt;br /&gt;
Операции выполняются для всех транзаций (&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; штук) и для всех кластеров (&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; штук). Итого выполняется &amp;lt;math&amp;gt;n*k*(m+8)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
В добавок к этому при добавлении/удалении транзакции к кластеру производится пересчет его характеристик: &amp;lt;math&amp;gt;m+2&amp;lt;/math&amp;gt; операции.&lt;br /&gt;
&lt;br /&gt;
Из того можно сделать вывод, что оценка сложность алгоритма равна &amp;lt;math&amp;gt;O(n*k*m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисление стоимости добавления/удаления транзакции, которые выполняются функциями DeltaAdd/DeltaRemove, происходит независимо для всех &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. Поэтому все вычисления можно производить параллельно. Таким образом сложность алгоритма с &amp;lt;math&amp;gt;O(n*k*m)&amp;lt;/math&amp;gt; понижается до &amp;lt;math&amp;gt;O(n*m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; транзакций длины &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и коэффициент отталкивания &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
метки классов для каждой транзакции в соответствии с проведенной кластеризацией(числовая последовательность длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности алгоритма определяется количеством кластеров: &amp;lt;math&amp;gt;\dfrac{O(n*k*m)}{O(n*m)} = k&amp;lt;/math&amp;gt;&lt;br /&gt;
* [[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] алгоритма равна &amp;lt;math&amp;gt;\dfrac{nk(m+8) + m + 2}{nm + n + 1} \cong k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Алгоритм не является [[глоссарий#Устойчивость|&#039;&#039;устойчивым&#039;&#039;]], так как результат работы зависит от порядка чтения транзакций и от текущего набора транзакций в кластере.&lt;br /&gt;
* Выполняется свойство сбалансированности операций между параллельными ветвями алгоритма, так как для каждой транзакции выполняются функции DeltaAdd/DeltaRemove, считающие стоимость добавления/удаления транзакции.&lt;br /&gt;
* Свойство [[глоссарий#Детерминированность|&#039;&#039;детерминированности алгоритмов&#039;&#039;]] не выполняется, так как результат алгоритма зависит от порядка прохождения транзакций. Но если рассматривать транзакции как нумерованный список, то результат будет определен однозначно от запуска к запуску. Однако существует расширение алгоритма, обеспечивающее свойство детерминированности. &amp;lt;ref&amp;gt;Li, Y., Le, J., Wang, M. Improving CLOPE’s Profit Value and Stability with an Optimized Agglomerative Approach. Algorithms 2015, 8, 380-394.&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;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* http://weka.sourceforge.net/doc.stable/weka/clusterers/CLOPE.html - реализация в open source библиотеке для анализа данных WEKA(Waikato Environment for Knowledge Analysis) на языке Java&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Yang, Y., Guan, H., You. J. CLOPE: A fast and Effective Clustering Algorithm for Transactional Data In Proc. of SIGKDD’02, July 23-26, 2002, Edmonton, Alberta, Canada.&lt;br /&gt;
&lt;br /&gt;
[2] Нейский И.М. Классификация и сравнение методов кластеризации&lt;br /&gt;
&lt;br /&gt;
[3] Павлин Н. Кластеризация категорийных данных: масштабируемый алгоритм CLOPE, https://basegroup.ru/community/articles/clope&lt;br /&gt;
&lt;br /&gt;
[4] Філонова О.О., Вороной С.М.. Алгоритм кластеризации поискових профилей пользователей для системы персонализации сайта, http://masters.donntu.org/2014/fknt/filonova/library/article2.htm&lt;/div&gt;</summary>
		<author><name>Boltonidze</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D0%BD%D0%B4%D1%80%D0%B5%D0%B9_%D0%A2%D1%83%D0%BC%D0%B0%D0%BD%D0%BE%D0%B2/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_CLOPE&amp;diff=15882</id>
		<title>Участник:Андрей Туманов/Алгоритм кластеризации категориальных данных CLOPE</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D0%BD%D0%B4%D1%80%D0%B5%D0%B9_%D0%A2%D1%83%D0%BC%D0%B0%D0%BD%D0%BE%D0%B2/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_CLOPE&amp;diff=15882"/>
		<updated>2016-11-03T11:46:02Z</updated>

		<summary type="html">&lt;p&gt;Boltonidze: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Алгоритм CLOPE (Clustering with sLOPE) неирархический метод кластеризации, предназначенный для кластеризации огромных наборов категориальных данных. К достоинствам алгоритма относятся высокие масштабируемость и скорость работы и качество кластеризации, что достигается использованием глобального критерия оптимизации на основе максимизации градиента высоты гистограммы кластера. Отличается простотой программной реализации. &lt;br /&gt;
&lt;br /&gt;
Во время работы алгоритм хранит в памяти небольшое количество информации по каждому кластеру и требует минимальное число сканирований набора данных. CLOPE автоматически подбирает количество кластеров, причем это регулируется одним единственным параметром - коэффициентом отталкивания &amp;lt;math&amp;gt; r &amp;lt;/math&amp;gt;. При этом он обеспечивает более высокую производительность и лучшее качество кластеризации в сравнении с многими иерархическими алгоритмами.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть имеется база транзакций &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, состоящая из множества транзакций &amp;lt;math&amp;gt;\{t_1,t_2,...,t_n\}&amp;lt;/math&amp;gt;. Каждая транзакция есть набор объектов &amp;lt;math&amp;gt;\{i_1,...,i_m\}&amp;lt;/math&amp;gt;. Множество кластеров &amp;lt;math&amp;gt;\{C_1,...,C_k\}&amp;lt;/math&amp;gt; есть разбиение множества &amp;lt;math&amp;gt;\{t_1,...,t_n\}&amp;lt;/math&amp;gt;, такое, что &amp;lt;math&amp;gt;C_1 \cup \dots \cup C_k=\{t_1,...,t_n\}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_i \ne \empty&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_i \cap C_j = \empty &amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i \ge 1, k \ge j&amp;lt;/math&amp;gt;. Каждый элемент &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; называется кластером, а &amp;lt;math&amp;gt;n, m, k&amp;lt;/math&amp;gt; – количество транзакций, количество объектов в базе транзакций и число кластеров соответственно.&lt;br /&gt;
&lt;br /&gt;
Каждый кластер &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; имеет следующие характеристики:&lt;br /&gt;
[[Файл:ExampleCLOPE.jpg|500px|thumb|right]]&lt;br /&gt;
&amp;lt;math&amp;gt;D(C)&amp;lt;/math&amp;gt; – множество уникальных объектов;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Occ(i,C)&amp;lt;/math&amp;gt; – количество вхождений (частота) объекта &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; в кластер &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;S(C)= \sum_{i \in D(C)} Occ(i,C)= \sum_{t_i \in C}  \mid t_i  \mid , &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;W(C)=  \mid D(C) \mid ,H(C)=S(C)/W(C) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Функция стоимости:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Profit(C) = \frac{\sum^{k}_{i=1} G(C_i) \times \mid C_i \mid} {\sum^{k}_{i=1} \mid C_i \mid } = \frac{\sum^{k}_{i=1} \frac{S(C_i)}{W(C_i)^r} \times \mid C_i \mid} {\sum^{k}_{i=1} \mid C_i \mid }  &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\mid C_i \mid&amp;lt;/math&amp;gt;  количество объектов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; – количество кластеров, &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; – коэффициент отталкивания &amp;lt;math&amp;gt;(0 &amp;lt; r \le 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С помощью параметра &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; регулируется уровень сходства транзакций внутри кластера, и, как&lt;br /&gt;
следствие, финальное количество кластеров. Этот коэффициент подбирается пользователем. Чем больше &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, тем ниже уровень сходства и тем больше кластеров будет сгенерировано.&lt;br /&gt;
&lt;br /&gt;
Постановка задачи кластеризации алгоритмом CLOPE выглядит следующим образом: &lt;br /&gt;
&lt;br /&gt;
для заданных &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; найти разбиение &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; такое, что: &lt;br /&gt;
&amp;lt;math&amp;gt;Profit(C) \longrightarrow max &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма состоит в вычислении на каждой итерации стоимости добавления и удаления транзакции из кластера: &lt;br /&gt;
&lt;br /&gt;
*вычисление нового размера кластера &amp;lt;math&amp;gt;S_{new}(C_i)=S(C_i) \pm \mid(t_n)\mid &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid(t_n)\mid&amp;lt;/math&amp;gt; - длина транзакции&lt;br /&gt;
&lt;br /&gt;
*вычисление новой ширины кластера &amp;lt;math&amp;gt;W_{new}(C_i)=\mid D(C_i \cup t_n)|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*вычисление стоимости &amp;lt;math&amp;gt;\frac{S_{new}(C_i)(\mid C_i \mid \pm 1)}{W_{new}(C_i)^r} - \frac{S(C_i) \mid C_i \mid }{W(C_i)^r}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из следующих этапов:&lt;br /&gt;
&lt;br /&gt;
1. &#039;&#039;&#039;Инициализация&#039;&#039;&#039;. На этом этапе происходит первый проход по таблице с транзакциями для построения начального разбиения, для каждой транзакции определяется кластер исходя из максимизации стоимости.&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;Итерация&#039;&#039;&#039;. На данном этапе для каждой транзакции проводится попытка перемещения в другой кластер для максимизации функции стоимости.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первая часть алгоритма - инициализация: для каждой транзакции вычисляется кластер, к которому она будет отнесена исходя из максимизации функции стоимости. Для этого вычисляется вспомогательная функция DeltaAdd, которая считает стоимость добавления транзакции к одному из существующих кластеров, либо к пустому. В итоге транзакция помещается в кластер, для которого цена добавления максимальна.&lt;br /&gt;
&lt;br /&gt;
Вторая часть алгоритма - уточняющие итерации: здесь происходит попытка улучшить вычисленные на первом этапе кластеры. В каждой итерации происходит перебор всех транзакций, и для каждой транзакции вычисляется цена удаления ее из текущего кластера и цена добавления в другой кластер. Суммарная стоимость перемещения будет являться суммой стоимостей удаления и добавления. Если максимальная стоимость перемещения данной транзакции в какой-либо больше нуля, то она перемещается в этот кластер. &lt;br /&gt;
&lt;br /&gt;
Вычисления происходят до тех пор, пока за итерацию происходит хотя бы одно перемещение транзакции. Если за итерацию не было произведено ни одного перемещения, то текущее состояние кластеров является устойчивым и оптимальным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Схема реализации на псевдокоде:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Входные параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; - транзакции&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - коэффициент отталкивания&lt;br /&gt;
&lt;br /&gt;
Выходной параметр:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; кластеры, в начале алгоритма - пустое множество&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация:&#039;&#039;&#039;&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; t_i in t:&lt;br /&gt;
    max = 0&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; C_j in C:&lt;br /&gt;
            &#039;&#039;&#039;if&#039;&#039;&#039; DeltaAdd(C_j,t_i,r) &amp;gt; max:&lt;br /&gt;
                max = DeltaAdd(C_j,t_i,r)&lt;br /&gt;
                C_best = C_j&lt;br /&gt;
    &#039;&#039;&#039;put&#039;&#039;&#039; t_i in C_best&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итерации:&#039;&#039;&#039;&lt;br /&gt;
    move = True&lt;br /&gt;
    &#039;&#039;&#039;while&#039;&#039;&#039; move == True:&lt;br /&gt;
    move = False&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; t_i in t:&lt;br /&gt;
            max = 0&lt;br /&gt;
            C_now = t_i.cluster&lt;br /&gt;
            removeCost = DeltaRemove(C_now,t_i,r)&lt;br /&gt;
            &#039;&#039;&#039;for&#039;&#039;&#039; C_j in C:&lt;br /&gt;
                &#039;&#039;&#039;if&#039;&#039;&#039; DeltaAdd(C_j,t_i,r) + removeCost &amp;gt; max:&lt;br /&gt;
                    max = DeltaAdd(C_j,t_i,r) + removeCost&lt;br /&gt;
                    C_best = C_j&lt;br /&gt;
        if max &amp;gt; 0&lt;br /&gt;
            &#039;&#039;&#039;del&#039;&#039;&#039; t_i from C_now&lt;br /&gt;
            &#039;&#039;&#039;put&#039;&#039;&#039; t_i in C_best&lt;br /&gt;
            move = True&lt;br /&gt;
&lt;br /&gt;
Вспомогательная функция &#039;&#039;&#039;DeltaAdd&#039;&#039;&#039;:&lt;br /&gt;
    &#039;&#039;&#039;function&#039;&#039;&#039; DeltaAdd(C,t,r)&lt;br /&gt;
        S_new=C.size + t.itemCount&lt;br /&gt;
        W_new=C.wigth&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; item in t_i:&lt;br /&gt;
            &#039;&#039;&#039;if&#039;&#039;&#039; C_j.occ(item) = 0&lt;br /&gt;
                &#039;&#039;W_new = W_new + 1&lt;br /&gt;
        &#039;&#039;&#039;return&#039;&#039;&#039; S_new * (C.count+1) / (W_new ^ r) - (C.size * C.count) / (C.wigth ^ r)&lt;br /&gt;
&lt;br /&gt;
Вспомогательная функция &#039;&#039;&#039;DeltaRemove&#039;&#039;&#039;:&lt;br /&gt;
    &#039;&#039;&#039;function&#039;&#039;&#039; DeltaRemove(C,t,r)&lt;br /&gt;
        S_new=C.size - t.itemCount&lt;br /&gt;
        W_new=C.wigth&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; item in t:&lt;br /&gt;
            &#039;&#039;&#039;if&#039;&#039;&#039; C_j.occ(item) = 1&lt;br /&gt;
                &#039;&#039;W_new = W_new - 1&lt;br /&gt;
        &#039;&#039;&#039;return&#039;&#039;&#039; S_new * (C.count-1) / (W_new ^ r) - (C.size * C.count) / (C.wigth ^ r)&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В соответствии с ранее введенным обозначением &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - количество транзакций, &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - длина транзакции(максимальная), &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров.&lt;br /&gt;
&lt;br /&gt;
Основные вычисления восполняются в функции DeltaAdd/DeltaRemove: производится 1 сложение, не более &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; сложений/вычитаний, 2 умножения, 2 деления, 2 возведения в степень и 1 сложение - итого &amp;lt;math&amp;gt;m + 8&amp;lt;/math&amp;gt; операций. &lt;br /&gt;
&lt;br /&gt;
Операции выполняются для всех транзаций (&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; штук) и для всех кластеров (&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; штук). Итого выполняется &amp;lt;math&amp;gt;n*k*(m+8)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
В добавок к этому при добавлении/удалении транзакции к кластеру производится пересчет его характеристик: &amp;lt;math&amp;gt;m+2&amp;lt;/math&amp;gt; операции.&lt;br /&gt;
&lt;br /&gt;
Из того можно сделать вывод, что оценка сложность алгоритма равна &amp;lt;math&amp;gt;O(n*k*m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисление стоимости добавления/удаления транзакции, которые выполняются функциями DeltaAdd/DeltaRemove, происходит независимо для всех &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. Поэтому все вычисления можно производить параллельно. Таким образом сложность алгоритма с &amp;lt;math&amp;gt;O(n*k*m)&amp;lt;/math&amp;gt; понижается до &amp;lt;math&amp;gt;O(n*m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; транзакций длины &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и коэффициент отталкивания &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
метки классов для каждой транзакции в соответствии с проведенной кластеризацией(числовая последовательность длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности алгоритма определяется количеством кластеров: &amp;lt;math&amp;gt;\dfrac{O(n*k*m)}{O(n*m)} = k&amp;lt;/math&amp;gt;&lt;br /&gt;
* [[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] алгоритма равна &amp;lt;math&amp;gt;\dfrac{nk(m+8) + m + 2}{nm + n + 1} \cong k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Алгоритм не является [[глоссарий#Устойчивость|&#039;&#039;устойчивым&#039;&#039;]], так как результат работы зависит от порядка чтения транзакций и от текущего набора транзакций в кластере.&lt;br /&gt;
* Выполняется свойство сбалансированности операций между параллельными ветвями алгоритма, так как для каждой транзакции выполняются функции DeltaAdd/DeltaRemove, считающие стоимость добавления/удаления транзакции.&lt;br /&gt;
* Свойство [[глоссарий#Детерминированность|&#039;&#039;детерминированности алгоритмов&#039;&#039;]] не выполняется, так как результат алгоритма зависит от порядка прохождения транзакций. Но если рассматривать транзакции как нумерованный список, то результат будет определен однозначно от запуска к запуску.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* http://weka.sourceforge.net/doc.stable/weka/clusterers/CLOPE.html - реализация в open source библиотеке для анализа данных WEKA(Waikato Environment for Knowledge Analysis) на языке Java&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Yang, Y., Guan, H., You. J. CLOPE: A fast and Effective Clustering Algorithm for Transactional Data In Proc. of SIGKDD’02, July 23-26, 2002, Edmonton, Alberta, Canada.&lt;br /&gt;
&lt;br /&gt;
[2] Нейский И.М. Классификация и сравнение методов кластеризации&lt;br /&gt;
&lt;br /&gt;
[3] Павлин Н. Кластеризация категорийных данных: масштабируемый алгоритм CLOPE, https://basegroup.ru/community/articles/clope&lt;br /&gt;
&lt;br /&gt;
[4] Філонова О.О., Вороной С.М.. Алгоритм кластеризации поискових профилей пользователей для системы персонализации сайта, http://masters.donntu.org/2014/fknt/filonova/library/article2.htm&lt;/div&gt;</summary>
		<author><name>Boltonidze</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D0%BD%D0%B4%D1%80%D0%B5%D0%B9_%D0%A2%D1%83%D0%BC%D0%B0%D0%BD%D0%BE%D0%B2/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_CLOPE&amp;diff=15874</id>
		<title>Участник:Андрей Туманов/Алгоритм кластеризации категориальных данных CLOPE</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D0%BD%D0%B4%D1%80%D0%B5%D0%B9_%D0%A2%D1%83%D0%BC%D0%B0%D0%BD%D0%BE%D0%B2/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_CLOPE&amp;diff=15874"/>
		<updated>2016-11-03T10:32:27Z</updated>

		<summary type="html">&lt;p&gt;Boltonidze: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Алгоритм CLOPE (Clustering with sLOPE) неирархический метод кластеризации, предназначенный для кластеризации огромных наборов категориальных данных. К достоинствам алгоритма относятся высокие масштабируемость и скорость работы и качество кластеризации, что достигается использованием глобального критерия оптимизации на основе максимизации градиента высоты гистограммы кластера. Отличается простотой программной реализации. &lt;br /&gt;
&lt;br /&gt;
Во время работы алгоритм хранит в памяти небольшое количество информации по каждому кластеру и требует минимальное число сканирований набора данных. CLOPE автоматически подбирает количество кластеров, причем это регулируется одним единственным параметром - коэффициентом отталкивания &amp;lt;math&amp;gt; r &amp;lt;/math&amp;gt;. При этом он обеспечивает более высокую производительность и лучшее качество кластеризации в сравнении с многими иерархическими алгоритмами.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть имеется база транзакций &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, состоящая из множества транзакций &amp;lt;math&amp;gt;\{t_1,t_2,...,t_n\}&amp;lt;/math&amp;gt;. Каждая транзакция есть набор объектов &amp;lt;math&amp;gt;\{i_1,...,i_m\}&amp;lt;/math&amp;gt;. Множество кластеров &amp;lt;math&amp;gt;\{C_1,...,C_k\}&amp;lt;/math&amp;gt; есть разбиение множества &amp;lt;math&amp;gt;\{t_1,...,t_n\}&amp;lt;/math&amp;gt;, такое, что &amp;lt;math&amp;gt;C_1 \cup \dots \cup C_k=\{t_1,...,t_n\}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_i \ne \empty&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_i \cap C_j = \empty &amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i \ge 1, k \ge j&amp;lt;/math&amp;gt;. Каждый элемент &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; называется кластером, а &amp;lt;math&amp;gt;n, m, k&amp;lt;/math&amp;gt; – количество транзакций, количество объектов в базе транзакций и число кластеров соответственно.&lt;br /&gt;
&lt;br /&gt;
Каждый кластер &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; имеет следующие характеристики:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;D(C)&amp;lt;/math&amp;gt; – множество уникальных объектов;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Occ(i,C)&amp;lt;/math&amp;gt; – количество вхождений (частота) объекта &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; в кластер &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;S(C)= \sum_{i \in D(C)} Occ(i,C)= \sum_{t_i \in C}  \mid t_i  \mid , &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;W(C)=  \mid D(C) \mid ,H(C)=S(C)/W(C) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функция стоимости:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Profit(C) = \frac{\sum^{k}_{i=1} G(C_i) \times \mid C_i \mid} {\sum^{k}_{i=1} \mid C_i \mid } = \frac{\sum^{k}_{i=1} \frac{S(C_i)}{W(C_i)^r} \times \mid C_i \mid} {\sum^{k}_{i=1} \mid C_i \mid }  &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\mid C_i \mid&amp;lt;/math&amp;gt;  количество объектов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; – количество кластеров, &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; – коэффициент отталкивания &amp;lt;math&amp;gt;(0 &amp;lt; r \le 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С помощью параметра &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; регулируется уровень сходства транзакций внутри кластера, и, как&lt;br /&gt;
следствие, финальное количество кластеров. Этот коэффициент подбирается пользователем. Чем больше &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, тем ниже уровень сходства и тем больше кластеров будет сгенерировано.&lt;br /&gt;
&lt;br /&gt;
Постановка задачи кластеризации алгоритмом CLOPE выглядит следующим образом: &lt;br /&gt;
&lt;br /&gt;
для заданных &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; найти разбиение &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; такое, что: &lt;br /&gt;
&amp;lt;math&amp;gt;Profit(C) \longrightarrow max &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма состоит в вычислении на каждой итерации стоимости добавления и удаления транзакции из кластера: &lt;br /&gt;
&lt;br /&gt;
*вычисление нового размера кластера &amp;lt;math&amp;gt;S_{new}(C_i)=S(C_i) \pm \mid(t_n)\mid &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid(t_n)\mid&amp;lt;/math&amp;gt; - длина транзакции&lt;br /&gt;
&lt;br /&gt;
*вычисление новой ширины кластера &amp;lt;math&amp;gt;W_{new}(C_i)=\mid D(C_i \cup t_n)|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*вычисление стоимости &amp;lt;math&amp;gt;\frac{S_{new}(C_i)(\mid C_i \mid \pm 1)}{W_{new}(C_i)^r} - \frac{S(C_i) \mid C_i \mid }{W(C_i)^r}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из следующих этапов:&lt;br /&gt;
&lt;br /&gt;
1. &#039;&#039;&#039;Инициализация&#039;&#039;&#039;. На этом этапе происходит первый проход по таблице с транзакциями для построения начального разбиения, для каждой транзакции определяется кластер исходя из максимизации стоимости.&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;Итерация&#039;&#039;&#039;. На данном этапе для каждой транзакции проводится попытка перемещения в другой кластер для максимизации функции стоимости.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первая часть алгоритма - инициализация: для каждой транзакции вычисляется кластер, к которому она будет отнесена исходя из максимизации функции стоимости. Для этого вычисляется вспомогательная функция DeltaAdd, которая считает стоимость добавления транзакции к одному из существующих кластеров, либо к пустому. В итоге транзакция помещается в кластер, для которого цена добавления максимальна.&lt;br /&gt;
&lt;br /&gt;
Вторая часть алгоритма - уточняющие итерации: здесь происходит попытка улучшить вычисленные на первом этапе кластеры. В каждой итерации происходит перебор всех транзакций, и для каждой транзакции вычисляется цена удаления ее из текущего кластера и цена добавления в другой кластер. Суммарная стоимость перемещения будет являться суммой стоимостей удаления и добавления. Если максимальная стоимость перемещения данной транзакции в какой-либо больше нуля, то она перемещается в этот кластер. &lt;br /&gt;
&lt;br /&gt;
Вычисления происходят до тех пор, пока за итерацию происходит хотя бы одно перемещение транзакции. Если за итерацию не было произведено ни одного перемещения, то текущее состояние кластеров является устойчивым и оптимальным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Схема реализации на псевдокоде:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Входные параметры:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; - транзакции&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - коэффициент отталкивания&lt;br /&gt;
&lt;br /&gt;
Выходной параметр:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; кластеры, в начале алгоритма - пустое множество&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация:&#039;&#039;&#039;&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; t_i in t:&lt;br /&gt;
    max = 0&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; C_j in C:&lt;br /&gt;
            &#039;&#039;&#039;if&#039;&#039;&#039; DeltaAdd(C_j,t_i,r) &amp;gt; max:&lt;br /&gt;
                max = DeltaAdd(C_j,t_i,r)&lt;br /&gt;
                C_best = C_j&lt;br /&gt;
    &#039;&#039;&#039;put&#039;&#039;&#039; t_i in C_best&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итерации:&#039;&#039;&#039;&lt;br /&gt;
    move = True&lt;br /&gt;
    &#039;&#039;&#039;while&#039;&#039;&#039; move == True:&lt;br /&gt;
    move = False&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; t_i in t:&lt;br /&gt;
            max = 0&lt;br /&gt;
            C_now = t_i.cluster&lt;br /&gt;
            removeCost = DeltaRemove(C_now,t_i,r)&lt;br /&gt;
            &#039;&#039;&#039;for&#039;&#039;&#039; C_j in C:&lt;br /&gt;
                &#039;&#039;&#039;if&#039;&#039;&#039; DeltaAdd(C_j,t_i,r) + removeCost &amp;gt; max:&lt;br /&gt;
                    max = DeltaAdd(C_j,t_i,r) + removeCost&lt;br /&gt;
                    C_best = C_j&lt;br /&gt;
        if max &amp;gt; 0&lt;br /&gt;
            &#039;&#039;&#039;del&#039;&#039;&#039; t_i from C_now&lt;br /&gt;
            &#039;&#039;&#039;put&#039;&#039;&#039; t_i in C_best&lt;br /&gt;
            move = True&lt;br /&gt;
&lt;br /&gt;
Вспомогательная функция &#039;&#039;&#039;DeltaAdd&#039;&#039;&#039;:&lt;br /&gt;
    &#039;&#039;&#039;function&#039;&#039;&#039; DeltaAdd(C,t,r)&lt;br /&gt;
        S_new=C.size + t.itemCount&lt;br /&gt;
        W_new=C.wigth&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; item in t_i:&lt;br /&gt;
            &#039;&#039;&#039;if&#039;&#039;&#039; C_j.occ(item) = 0&lt;br /&gt;
                &#039;&#039;W_new = W_new + 1&lt;br /&gt;
        &#039;&#039;&#039;return&#039;&#039;&#039; S_new * (C.count+1) / (W_new ^ r) - (C.size * C.count) / (C.wigth ^ r)&lt;br /&gt;
&lt;br /&gt;
Вспомогательная функция &#039;&#039;&#039;DeltaRemove&#039;&#039;&#039;:&lt;br /&gt;
    &#039;&#039;&#039;function&#039;&#039;&#039; DeltaRemove(C,t,r)&lt;br /&gt;
        S_new=C.size - t.itemCount&lt;br /&gt;
        W_new=C.wigth&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; item in t:&lt;br /&gt;
            &#039;&#039;&#039;if&#039;&#039;&#039; C_j.occ(item) = 1&lt;br /&gt;
                &#039;&#039;W_new = W_new - 1&lt;br /&gt;
        &#039;&#039;&#039;return&#039;&#039;&#039; S_new * (C.count-1) / (W_new ^ r) - (C.size * C.count) / (C.wigth ^ r)&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В соответствии с ранее введенным обозначением &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - количество транзакций, &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - длина транзакции(максимальная), &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров.&lt;br /&gt;
&lt;br /&gt;
Основные вычисления восполняются в функции DeltaAdd/DeltaRemove: производится 1 сложение, не более &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; сложений/вычитаний, 2 умножения, 2 деления, 2 возведения в степень и 1 сложение - итого &amp;lt;math&amp;gt;m + 8&amp;lt;/math&amp;gt; операций. &lt;br /&gt;
&lt;br /&gt;
Операции выполняются для всех транзаций (&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; штук) и для всех кластеров (&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; штук). Итого выполняется &amp;lt;math&amp;gt;n*k*(m+8)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
В добавок к этому при добавлении/удалении транзакции к кластеру производится пересчет его характеристик: &amp;lt;math&amp;gt;m+2&amp;lt;/math&amp;gt; операции.&lt;br /&gt;
&lt;br /&gt;
Из того можно сделать вывод, что оценка сложность алгоритма равна &amp;lt;math&amp;gt;O(n*k*m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисление стоимости добавления/удаления транзакции, которые выполняются функциями DeltaAdd/DeltaRemove, происходит независимо для всех &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. Поэтому все вычисления можно производить параллельно. Таким образом сложность алгоритма с &amp;lt;math&amp;gt;O(n*k*m)&amp;lt;/math&amp;gt; понижается до &amp;lt;math&amp;gt;O(n*m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; транзакций длины &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и коэффициент отталкивания &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
метки классов для каждой транзакции в соответствии с проведенной кластеризацией(числовая последовательность длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности алгоритма определяется количеством кластеров: &amp;lt;math&amp;gt;\dfrac{O(n*k*m)}{O(n*m)} = k&amp;lt;/math&amp;gt;&lt;br /&gt;
* [[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] алгоритма равна &amp;lt;math&amp;gt;\dfrac{nk(m+8) + m + 2}{nm + n + 1} \cong k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Алгоритм не является [[глоссарий#Устойчивость|&#039;&#039;устойчивым&#039;&#039;]], так как результат работы зависит от порядка чтения транзакций и от текущего набора транзакций в кластере.&lt;br /&gt;
* Выполняется свойство сбалансированности операций между параллельными ветвями алгоритма, так как для каждой транзакции выполняются функции DeltaAdd/DeltaRemove, считающие стоимость добавления/удаления транзакции.&lt;br /&gt;
* Свойство [[глоссарий#Детерминированность|&#039;&#039;детерминированности алгоритмов&#039;&#039;]] не выполняется, так как результат алгоритма зависит от порядка прохождения транзакций. Но если рассматривать транзакции как нумерованный список, то результат будет определен однозначно от запуска к запуску.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* http://weka.sourceforge.net/doc.stable/weka/clusterers/CLOPE.html - реализация в open source библиотеке для анализа данных WEKA(Waikato Environment for Knowledge Analysis) на языке Java&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Yang, Y., Guan, H., You. J. CLOPE: A fast and Effective Clustering Algorithm for Transactional Data In Proc. of SIGKDD’02, July 23-26, 2002, Edmonton, Alberta, Canada.&lt;br /&gt;
&lt;br /&gt;
[2] Нейский И.М. Классификация и сравнение методов кластеризации&lt;br /&gt;
&lt;br /&gt;
[3] Павлин Н. Кластеризация категорийных данных: масштабируемый алгоритм CLOPE, https://basegroup.ru/community/articles/clope&lt;br /&gt;
&lt;br /&gt;
[4] Філонова О.О., Вороной С.М.. Алгоритм кластеризации поискових профилей пользователей для системы персонализации сайта, http://masters.donntu.org/2014/fknt/filonova/library/article2.htm&lt;/div&gt;</summary>
		<author><name>Boltonidze</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D0%BD%D0%B4%D1%80%D0%B5%D0%B9_%D0%A2%D1%83%D0%BC%D0%B0%D0%BD%D0%BE%D0%B2/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_CLOPE&amp;diff=15872</id>
		<title>Участник:Андрей Туманов/Алгоритм кластеризации категориальных данных CLOPE</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%D0%BD%D0%B4%D1%80%D0%B5%D0%B9_%D0%A2%D1%83%D0%BC%D0%B0%D0%BD%D0%BE%D0%B2/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_CLOPE&amp;diff=15872"/>
		<updated>2016-11-03T10:13:31Z</updated>

		<summary type="html">&lt;p&gt;Boltonidze: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Алгоритм CLOPE (Clustering with sLOPE) неирархический метод кластеризации, предназначенный для кластеризации огромных наборов категориальных данных. К достоинствам алгоритма относятся высокие масштабируемость и скорость работы и качество кластеризации, что достигается использованием глобального критерия оптимизации на основе максимизации градиента высоты гистограммы кластера. Отличается простотой программной реализации. &lt;br /&gt;
&lt;br /&gt;
Во время работы алгоритм хранит в памяти небольшое количество информации по каждому кластеру и требует минимальное число сканирований набора данных. CLOPE автоматически подбирает количество кластеров, причем это регулируется одним единственным параметром - коэффициентом отталкивания &amp;lt;math&amp;gt; r &amp;lt;/math&amp;gt;. При этом он обеспечивает более высокую производительность и лучшее качество кластеризации в сравнении с многими иерархическими алгоритмами.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть имеется база транзакций &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, состоящая из множества транзакций &amp;lt;math&amp;gt;\{t_1,t_2,...,t_n\}&amp;lt;/math&amp;gt;. Каждая транзакция есть набор объектов &amp;lt;math&amp;gt;\{i_1,...,i_m\}&amp;lt;/math&amp;gt;. Множество кластеров &amp;lt;math&amp;gt;\{C_1,...,C_k\}&amp;lt;/math&amp;gt; есть разбиение множества &amp;lt;math&amp;gt;\{t_1,...,t_n\}&amp;lt;/math&amp;gt;, такое, что &amp;lt;math&amp;gt;C_1 \cup \dots \cup C_k=\{t_1,...,t_n\}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_i \ne \empty&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_i \cap C_j = \empty &amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i \ge 1, k \ge j&amp;lt;/math&amp;gt;. Каждый элемент &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; называется кластером, а &amp;lt;math&amp;gt;n, m, k&amp;lt;/math&amp;gt; – количество транзакций, количество объектов в базе транзакций и число кластеров соответственно.&lt;br /&gt;
&lt;br /&gt;
Каждый кластер &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; имеет следующие характеристики:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;D(C)&amp;lt;/math&amp;gt; – множество уникальных объектов;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Occ(i,C)&amp;lt;/math&amp;gt; – количество вхождений (частота) объекта &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; в кластер &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;S(C)= \sum_{i \in D(C)} Occ(i,C)= \sum_{t_i \in C}  \mid t_i  \mid , &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;W(C)=  \mid D(C) \mid ,H(C)=S(C)/W(C) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функция стоимости:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Profit(C) = \frac{\sum^{k}_{i=1} G(C_i) \times \mid C_i \mid} {\sum^{k}_{i=1} \mid C_i \mid } = \frac{\sum^{k}_{i=1} \frac{S(C_i)}{W(C_i)^r} \times \mid C_i \mid} {\sum^{k}_{i=1} \mid C_i \mid }  &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\mid C_i \mid&amp;lt;/math&amp;gt;  количество объектов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; – количество кластеров, &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; – коэффициент отталкивания &amp;lt;math&amp;gt;(0 &amp;lt; r \le 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С помощью параметра &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; регулируется уровень сходства транзакций внутри кластера, и, как&lt;br /&gt;
следствие, финальное количество кластеров. Этот коэффициент подбирается пользователем. Чем больше &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, тем ниже уровень сходства и тем больше кластеров будет сгенерировано.&lt;br /&gt;
&lt;br /&gt;
Постановка задачи кластеризации алгоритмом CLOPE выглядит следующим образом: &lt;br /&gt;
&lt;br /&gt;
для заданных &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; найти разбиение &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; такое, что: &lt;br /&gt;
&amp;lt;math&amp;gt;Profit(C) \longrightarrow max &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма состоит в вычислении на каждой итерации стоимости добавления и удаления транзакции из кластера: &lt;br /&gt;
&lt;br /&gt;
*вычисление нового размера кластера &amp;lt;math&amp;gt;S_{new}(C_i)=S(C_i) \pm \mid(t_n)\mid &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid(t_n)\mid&amp;lt;/math&amp;gt; - длина транзакции&lt;br /&gt;
&lt;br /&gt;
*вычисление новой ширины кластера &amp;lt;math&amp;gt;W_{new}(C_i)=\mid D(C_i \cup t_n)|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*вычисление стоимости &amp;lt;math&amp;gt;\frac{S_{new}(C_i)(\mid C_i \mid \pm 1)}{W_{new}(C_i)^r} - \frac{S(C_i) \mid C_i \mid }{W(C_i)^r}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из следующих этапов:&lt;br /&gt;
&lt;br /&gt;
1. &#039;&#039;&#039;Инициализация&#039;&#039;&#039;. На этом этапе происходит первый проход по таблице с транзакциями для построения начального разбиения, для каждой транзакции определяется кластер исходя из максимизации стоимости.&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;Итерация&#039;&#039;&#039;. На данном этапе для каждой транзакции проводится попытка перемещения в другой кластер для максимизации функции стоимости.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первая часть алгоритма - инициализация: для каждой транзакции вычисляется кластер, к которому она будет отнесена исходя из максимизации функции стоимости. Для этого вычисляется вспомогательная функция DeltaAdd, которая считает стоимость добавления транзакции к одному из существующих кластеров, либо к пустому. В итоге транзакция помещается в кластер, для которого цена добавления максимальна.&lt;br /&gt;
&lt;br /&gt;
Вторая часть алгоритма - уточняющие итерации: здесь происходит попытка улучшить вычисленные на первом этапе кластеры. В каждой итерации происходит перебор всех транзакций, и для каждой транзакции вычисляется цена удаления ее из текущего кластера и цена добавления в другой кластер. Суммарная стоимость перемещения будет являться суммой стоимостей удаления и добавления. Если максимальная стоимость перемещения данной транзакции в какой-либо больше нуля, то она перемещается в этот кластер. &lt;br /&gt;
&lt;br /&gt;
Вычисления происходят до тех пор, пока за итерацию происходит хотя бы одно перемещение транзакции. Если за итерацию не было произведено ни одного перемещения, то текущее состояние кластеров является устойчивым и оптимальным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Схема реализации на псевдокоде:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Входные параметры:&lt;br /&gt;
&lt;br /&gt;
-&amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; - транзакции&lt;br /&gt;
&lt;br /&gt;
-&amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - коэффициент отталкивания&lt;br /&gt;
&lt;br /&gt;
Выходной параметр:&lt;br /&gt;
&lt;br /&gt;
-&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; кластеры, в начале алгоритма - пустое множество&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация:&#039;&#039;&#039;&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; t_i in t:&lt;br /&gt;
    max = 0&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; C_j in C:&lt;br /&gt;
            &#039;&#039;&#039;if&#039;&#039;&#039; DeltaAdd(C_j,t_i,r) &amp;gt; max:&lt;br /&gt;
                max = DeltaAdd(C_j,t_i,r)&lt;br /&gt;
                C_best = C_j&lt;br /&gt;
    &#039;&#039;&#039;put&#039;&#039;&#039; t_i in C_best&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итерации:&#039;&#039;&#039;&lt;br /&gt;
    move = True&lt;br /&gt;
    &#039;&#039;&#039;while&#039;&#039;&#039; move == True:&lt;br /&gt;
    move = False&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; t_i in t:&lt;br /&gt;
            max = 0&lt;br /&gt;
            C_now = t_i.cluster&lt;br /&gt;
            removeCost = DeltaRemove(C_now,t_i,r)&lt;br /&gt;
            &#039;&#039;&#039;for&#039;&#039;&#039; C_j in C:&lt;br /&gt;
                &#039;&#039;&#039;if&#039;&#039;&#039; DeltaAdd(C_j,t_i,r) + removeCost &amp;gt; max:&lt;br /&gt;
                    max = DeltaAdd(C_j,t_i,r) + removeCost&lt;br /&gt;
                    C_best = C_j&lt;br /&gt;
        if max &amp;gt; 0&lt;br /&gt;
            &#039;&#039;&#039;del&#039;&#039;&#039; t_i from C_now&lt;br /&gt;
            &#039;&#039;&#039;put&#039;&#039;&#039; t_i in C_best&lt;br /&gt;
            move = True&lt;br /&gt;
&lt;br /&gt;
Вспомогательная функция &#039;&#039;&#039;DeltaAdd&#039;&#039;&#039;:&lt;br /&gt;
    &#039;&#039;&#039;function&#039;&#039;&#039; DeltaAdd(C,t,r)&lt;br /&gt;
        S_new=C.size + t.itemCount&lt;br /&gt;
        W_new=C.wigth&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; item in t_i:&lt;br /&gt;
            &#039;&#039;&#039;if&#039;&#039;&#039; C_j.occ(item) = 0&lt;br /&gt;
                &#039;&#039;W_new = W_new + 1&lt;br /&gt;
        &#039;&#039;&#039;return&#039;&#039;&#039; S_new * (C.count+1) / (W_new ^ r) - (C.size * C.count) / (C.wigth ^ r)&lt;br /&gt;
&lt;br /&gt;
Вспомогательная функция &#039;&#039;&#039;DeltaRemove&#039;&#039;&#039;:&lt;br /&gt;
    &#039;&#039;&#039;function&#039;&#039;&#039; DeltaRemove(C,t,r)&lt;br /&gt;
        S_new=C.size - t.itemCount&lt;br /&gt;
        W_new=C.wigth&lt;br /&gt;
        &#039;&#039;&#039;for&#039;&#039;&#039; item in t:&lt;br /&gt;
            &#039;&#039;&#039;if&#039;&#039;&#039; C_j.occ(item) = 1&lt;br /&gt;
                &#039;&#039;W_new = W_new - 1&lt;br /&gt;
        &#039;&#039;&#039;return&#039;&#039;&#039; S_new * (C.count-1) / (W_new ^ r) - (C.size * C.count) / (C.wigth ^ r)&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В соответствии с ранее введенным обозначением &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - количество транзакций, &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - длина транзакции(максимальная), &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров.&lt;br /&gt;
&lt;br /&gt;
Основные вычисления восполняются в функции DeltaAdd/DeltaRemove: производится 1 сложение, не более &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; сложений/вычитаний, 2 умножения, 2 деления, 2 возведения в степень и 1 сложение - итого &amp;lt;math&amp;gt;m + 8&amp;lt;/math&amp;gt; операций. &lt;br /&gt;
&lt;br /&gt;
Операции выполняются для всех транзаций (&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; штук) и для всех кластеров (&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; штук). Итого выполняется &amp;lt;math&amp;gt;n*k*(m+8)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
В добавок к этому при добавлении/удалении транзакции к кластеру производится пересчет его характеристик: &amp;lt;math&amp;gt;m+2&amp;lt;/math&amp;gt; операции.&lt;br /&gt;
&lt;br /&gt;
Из того можно сделать вывод, что оценка сложность алгоритма равна &amp;lt;math&amp;gt;O(n*k*m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисление стоимости добавления/удаления транзакции, которые выполняются функциями DeltaAdd/DeltaRemove, происходит независимо для всех &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. Поэтому все вычисления можно производить параллельно. Таким образом сложность алгоритма с &amp;lt;math&amp;gt;O(n*k*m)&amp;lt;/math&amp;gt; понижается до &amp;lt;math&amp;gt;O(n*m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; транзакций длины &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и коэффициент отталкивания &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
метки классов для каждой транзакции в соответствии с проведенной кластеризацией(числовая последовательность длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности алгоритма определяется количеством кластеров: &amp;lt;math&amp;gt;\dfrac{O(n*k*m)}{O(n*m)} = k&amp;lt;/math&amp;gt;&lt;br /&gt;
* [[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] алгоритма равна &amp;lt;math&amp;gt;\dfrac{nk(m+8) + m + 2}{nm + n + 1} \cong k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Алгоритм не является [[глоссарий#Устойчивость|&#039;&#039;устойчивым&#039;&#039;]], так как результат работы зависит от порядка чтения транзакций и от текущего набора транзакций в кластере.&lt;br /&gt;
* Выполняется свойство сбалансированности операций между параллельными ветвями алгоритма, так как для каждой транзакции выполняются функции DeltaAdd/DeltaRemove, считающие стоимость добавления/удаления транзакции.&lt;br /&gt;
* Свойство [[глоссарий#Детерминированность|&#039;&#039;детерминированности алгоритмов&#039;&#039;]] не выполняется, так как результат алгоритма зависит от порядка прохождения транзакций. Но если рассматривать транзакции как нумерованный список, то результат будет определен однозначно от запуска к запуску.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* http://weka.sourceforge.net/doc.stable/weka/clusterers/CLOPE.html - реализация в open source библиотеке для анализа данных WEKA(Waikato Environment for Knowledge Analysis) на языке Java&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Yang, Y., Guan, H., You. J. CLOPE: A fast and Effective Clustering Algorithm for Transactional Data In Proc. of SIGKDD’02, July 23-26, 2002, Edmonton, Alberta, Canada.&lt;br /&gt;
&lt;br /&gt;
[2] Нейский И.М. Классификация и сравнение методов кластеризации&lt;br /&gt;
&lt;br /&gt;
[3] Павлин Н. Кластеризация категорийных данных: масштабируемый алгоритм CLOPE, https://basegroup.ru/community/articles/clope&lt;br /&gt;
&lt;br /&gt;
[4] Філонова О.О., Вороной С.М.. Алгоритм кластеризации поискових профилей пользователей для системы персонализации сайта, http://masters.donntu.org/2014/fknt/filonova/library/article2.htm&lt;/div&gt;</summary>
		<author><name>Boltonidze</name></author>
	</entry>
</feed>