<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=%D0%90%D0%BD%D0%B4%D1%80%D0%B5%D0%B9+%D0%A2%D1%83%D0%BC%D0%B0%D0%BD%D0%BE%D0%B2</id>
	<title>Алговики - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=%D0%90%D0%BD%D0%B4%D1%80%D0%B5%D0%B9+%D0%A2%D1%83%D0%BC%D0%B0%D0%BD%D0%BE%D0%B2"/>
	<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/ru/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/%D0%90%D0%BD%D0%B4%D1%80%D0%B5%D0%B9_%D0%A2%D1%83%D0%BC%D0%B0%D0%BD%D0%BE%D0%B2"/>
	<updated>2026-10-22T17:20:49Z</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=21478</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=21478"/>
		<updated>2016-12-21T07:24:17Z</updated>

		<summary type="html">&lt;p&gt;Андрей Туманов: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
Основные авторы описания: [[Участник:Андрей_Туманов|А.Л.Туманов]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Входные и выходные данные алгоритма|1.9]]), [[Участник:Boltonidze|А.В.Александров]] ([[#Последовательная сложность алгоритма|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;
[[Файл:init_clope.png|600px|center|Инициализация]]&lt;br /&gt;
На этапе итерации функции DeltaAdd/DeltaRemove могут считать параллельно для каждой транзакции&lt;br /&gt;
[[Файл:iter_clope.png ‎|600px|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;
Проверка масштабируемости производилась с использованием стандарта MPI на суперкомпьютере &amp;quot;Ломоносов&amp;quot; с числом процессоров: 1,8,16,32,64.&lt;br /&gt;
Результаты проверки масштабируемости приведены ниже на графике&lt;br /&gt;
[[file:maschtab_clope.png||700px|График масштабируемости]]&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>Андрей Туманов</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=21475</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=21475"/>
		<updated>2016-12-20T23:45:11Z</updated>

		<summary type="html">&lt;p&gt;Андрей Туманов: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Андрей_Туманов|А.Л.Туманов]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Входные и выходные данные алгоритма|1.9]]), [[Участник:Boltonidze|А.В.Александров]] ([[#Последовательная сложность алгоритма|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;
[[Файл:init_clope.png|600px|center|Инициализация]]&lt;br /&gt;
На этапе итерации функции DeltaAdd/DeltaRemove могут считать параллельно для каждой транзакции&lt;br /&gt;
[[Файл:iter_clope.png ‎|600px|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;
Проверка масштабируемости производилась с использованием стандарта MPI на суперкомпьютере &amp;quot;Ломоносов&amp;quot; с числом процессоров: 1,8,16,32,64.&lt;br /&gt;
Результаты проверки масштабируемости приведены ниже на графике&lt;br /&gt;
[[file:maschtab_clope.png||700px|График масштабируемости]]&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>Андрей Туманов</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=21474</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=21474"/>
		<updated>2016-12-20T22:08:09Z</updated>

		<summary type="html">&lt;p&gt;Андрей Туманов: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Андрей_Туманов|А.Л.Туманов]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Входные и выходные данные алгоритма|1.9]]), [[Участник:Boltonidze|А.В.Александров]] ([[#Последовательная сложность алгоритма|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;
[[Файл:init_clope.png|600px|center|Инициализация]]&lt;br /&gt;
На этапе итерации функции DeltaAdd/DeltaRemove могут считать параллельно для каждой транзакции&lt;br /&gt;
[[Файл:iter_clope.png ‎|600px|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>Андрей Туманов</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Lineprinter&amp;diff=16088</id>
		<title>Обсуждение участника:Lineprinter</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Lineprinter&amp;diff=16088"/>
		<updated>2016-11-07T21:23:36Z</updated>

		<summary type="html">&lt;p&gt;Андрей Туманов: /* Перенос */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Перенос ==&lt;br /&gt;
Статья: [[Участник:Бобцов Борис/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки]]&lt;br /&gt;
Выполняет: [[Участник:Бобцов Борис| Бобцов Борис]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки]]&lt;br /&gt;
Выполняют: [[Участник:Greno4ka| Устинов Григорий ]] и [[ Лиджиев Данир ]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Кластеризация сетями Кохонена]]&lt;br /&gt;
Выполняют: [[Участник:Kravtsovkirill| Кравцов Кирилл]] и [[Участник:Emaksimov| Максимов Егор]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Нахождение собственных чисел квадратной матрицы методом QR разложения (2)]]&lt;br /&gt;
Выполняют: Баев Олег и Шевелев Александр&lt;br /&gt;
&lt;br /&gt;
Статья: [[Стабилизированный метод биспоряженных градиентов (BiCGSTAB)]]&lt;br /&gt;
Выполняют: Гаврилов Алексей и Новиков Александр&lt;br /&gt;
&lt;br /&gt;
Статья: [[Участники: Бобошко А., Юмакаева А./Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 4-го порядка]];&lt;br /&gt;
Выполняют: Бобошко Алексей и Юмакаева Алина&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм кластеризации, основанный на сетях Кохоннена]];&lt;br /&gt;
Выполняют:  Логвиненко Александра и Адиев Тохтар&lt;br /&gt;
&lt;br /&gt;
Статья: [[Ортогонализация Грама-Шмидта]];&lt;br /&gt;
Выполняют: [[Участник:KibAndrey| Кибанов Андрей]] и Аджиева Татьяна&lt;br /&gt;
&lt;br /&gt;
Статья: [[Самоорганизующиеся карты Кохонена]];&lt;br /&gt;
Выполняет: [[Участник:Anton goy| Гой Антон]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[ЕМ-алгоритм_(Тематическое_моделирование)]];&lt;br /&gt;
Выполняют: Мурат Апишев и Андрей Заночкин&lt;br /&gt;
&lt;br /&gt;
Статья:[[Алгоритм_Ланцоша_с_полной_переортогонализацией]];&lt;br /&gt;
Выполняет:[[Участник:Sfedotov| Федотов С.А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм_k-средних]]&lt;br /&gt;
Выполняют: [[Участник:Error2407|Богомазов Евгений]], [[Участник:Илья_Егоров|Егоров Илья]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм k-means]]&lt;br /&gt;
Выполняют: [[Участник:Бротиковская Данута|Данута Бротиковская]] и [[Участник:DennZo1993|Денис Зобнин]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Partitioning Around Medoids (Алгоритм)]]&lt;br /&gt;
Выполняют: [[Участник:Denemmy| Галеев Данил]] и [[Участник:Ivan.Z| Запутляев Иван]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Нечеткий_алгоритм_С_средних]]&lt;br /&gt;
Выполняют: [[Участник:Demon smd|Д.А.Гуськов]], [[Участник:marina abramenkova|М.А.Абраменкова]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Решение_задачи_Коши_для_системы_ОДУ_методом_Рунге-Кутты_4_порядка]];&lt;br /&gt;
Выполняют: [[Участник:Алимов_Дамир_Алиевич|Алимов Дамир]] и [[Участник:Anlesnichiy|Антон Лесничий]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Строгий_алгоритм_С_средних_(Hard_C-Means,_HCM)]];&lt;br /&gt;
Выполняют: [[Участник:Светлана_Лукьяненко|Лукьяненко Светлана]] и [[Участник:Юрий_Комаров|Комаров Юрий]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм кластеризации, основанный на минимальном остовном дереве]];&lt;br /&gt;
Выполняет: [[Участник:Astandrik | Стандрик Антон Сергеевич]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Умножение разреженной матрицы на вектор]];&lt;br /&gt;
Выполняет: [[Участник:Lexaloris | Новоселов Алексей]], Выполняет: [[Участник:kochet|П.А. Кочетков]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Нахождение_собственных_чисел_квадратной_матрицы_методом_QR_разложения_(3)|Нахождение собственных чисел квадратной матрицы методом QR разложения (3)]];&lt;br /&gt;
Выполняют: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод_Якоби_вычисления_сингулярных_чисел_и_векторов]];&lt;br /&gt;
Выполняют: [[Участница:Почернина_Елена| Почернина Елена]] и [[Участница:Светлана|Костюкова Светлана]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод_Ньютона_для_решения_систем_нелинейных_уравнений(2)]];&lt;br /&gt;
Выполняют: [[Участник:Oleggium|Гирняк О.Р.]], [[Участник:Dimx19|Васильков Д.А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм_кластеризации_с_использованием_представлений]];&lt;br /&gt;
Выполняют: [[Участник:Cookie|Шатков С.А.]], [[Участница:JuliaA|Антохина Ю.А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Быстрое_преобразование_Фурье_(FFT)|Быстрое преобразование Фурье (FFT)]];&lt;br /&gt;
Выполняют: [[Участник:Victoria_Stepanischeva|Степанищева Виктория]] и [[Участник:Igor_Munkin|Мунькин Игорь]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Быстрое_дискретное_преобразование_Фурье|Быстрое_дискретное_преобразование_Фурье]];&lt;br /&gt;
Выполняют: [[Участник:ivanov.kir.m | К.М.Иванов]], [[Участник:Pumpkin | А.C.Сапин]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Алгоритм_k_средних]]&lt;br /&gt;
Выполняют: [[Участник:Parkhomenko|Пархоменко Павел]], [[Участник:ivan.mashonskiy|Машонский Иван]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[EM-алгоритм_кластеризации]]&lt;br /&gt;
Выполняет: [[Участник:Noite|Зинченко Дмитрий]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Алгоритм_k_means]]&lt;br /&gt;
Выполняют: [[Участник:IanaV| Валуйская Яна]], [[Участник:GlotovES| Глотов Евгений]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод Якоби вычисления собственных значений симметричной матрицы ЗП |Метод Якоби вычисления собственных значений симметричной матрицы ЗП]];&lt;br /&gt;
Выполняют: [[Участник:Зиновьев Владимир|Зиновьев В.С.]], [[Участник:Пронин Андрей|Пронин А.М.]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Алгоритм_кластеризации,_основанный_на_минимальном_покрывающем_дереве]]&lt;br /&gt;
Выполняет: [[Участник:Kanast74|Дмитриева Анастасия]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Нахождение_собственных_чисел_квадратной_матрицы_методом_QR_разложения_(4)]]&lt;br /&gt;
Выполняют: [[Участник:F-morozov|Морозов Ф. В.]], [[Участник:Nataliya|Пащенко Н. Ф.]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Хранение_ненулевых_элементов_разреженных_матриц._Умножение_разреженной_матрицы_на_вектор]];&lt;br /&gt;
Выполняют: [[Участник:Trrufina|Третьякова Р.М.]] и [[Участник:Екатерина_Буторина|Буторина Е.В.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм_кластеризации_с_использованием_представлений2]];&lt;br /&gt;
Выполняет: [[Участник:Лукьянова Анна|Лукьянова А.Я.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод Якоби вычисления собственных значений симметричной матрицы]];&lt;br /&gt;
Выполняют: [[Участник: Galkina|Галкина А.С.]], [[Участник: Игорь|Плахов И.А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод рекурсивной координатной бисекции]];&lt;br /&gt;
Выполняют: [[Участник: Obirvalger|Гордеев Михаил]], [[Участник: KolmakovEA|Колмаков Евгений]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Итерационный метод решения системы линейных алгебраических уравнений GMRES (обобщенный метод минимальных невязок)]];&lt;br /&gt;
Выполняют: [[Участник: Эльвира Ахиярова|Ахиярова Эльвира]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Хранение ненулевых элементов разреженной матрицы. Умножение разреженной матрицы на вектор]];&lt;br /&gt;
Выполняют: [[Участник: Janyell|Сычева Евгения]], [[Участник: Ahahalin|Хахалин Анатолий]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Построение матрицы Адамара произвольного размера]];&lt;br /&gt;
Выполняют: [[Участник: Бугаков Юрий|Бугаков Юрий]], Кужамалиев Ернур&lt;br /&gt;
&lt;br /&gt;
Статья: [[Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки (1)]]&lt;br /&gt;
Выполняют: [[Участница:Sannikovats| Санникова Татьяна Сергеевна]], [[Участник:Plukshin| Лукшин Петр Андреевич]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм кластеризации, основанный на построении каркаса]];&lt;br /&gt;
Выполняют: [[Участник:SenderovichNikita| Сендерович Никита]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм кластеризации, основанный на максимизации ожидания]];&lt;br /&gt;
Выполняют: Готман Мария, Лукашкина Юлия&lt;br /&gt;
&lt;br /&gt;
Статья: [[Partitioning_Around_Medoids_(PAM)]]&lt;br /&gt;
Выполняют: [[Участник:Avasilenko|А.Э.Василенко]], [[Участник:Anastasia|А.В.Тузикова]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Нечеткий алгоритм С-средних (Fuzzy C-means)]]&lt;br /&gt;
Выполняют: [[Участник:Nikmedoed|Н.А. Муромцев]], [[Участник:illusive_mike|М.С. Дворецкий]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Нечеткий алгоритм C средних]]&lt;br /&gt;
Выполняют: [[Участник:Gkhazeeva|Гелана Хазеева]], [[Участник:Yushin|Павел Юшин]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Плотностный алгоритм кластеризации DBSCAN]]&lt;br /&gt;
Выполняют: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Кластеризация Partitioning Around Medoids (PAM)]]&lt;br /&gt;
Выполняют:[[ Участник:Тодуа Антон| Тодуа Антон]], [[Участник:Гусева Юлия| Гусева Юлия]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Участник:Бугаков Юрий (613 группа), Кужамалиев Ернур (601 группа)/Построение матрицы Адамара произвольной размерности]]&lt;br /&gt;
Выполняют:[[ Участник:Бугаков Юрий| Бугаков Юрий]], [[Участник:Кужамалиев Ернур| Кужамалиев Ернур]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Участник:Nikita/Построение_матрицы_Адамара|Построение матрицы Адамара]]&lt;br /&gt;
Выполняют: [[Участник:Nikita|Иванов Никита]], [[Участник:Tsyganov Nikita|Цыганов Никита]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод Ньютона для решения систем нелинейных уравнений]]&lt;br /&gt;
Выполняют: [[Участник:Александр Чернышев|Александр Чернышев]], [[Участник:Захаров Никита|Захаров Никита]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[BIRCH|Сбалансированный итеративный алгоритм редукции и кластеризации с использованием иерархий&lt;br /&gt;
(BIRCH)]]&lt;br /&gt;
Выполняют: [[Участник:Светлана Морозова|Морозова Светлана]], [[Участник:Smirnov.maxim|Смирнов Максим]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Плотностный_алгоритм_кластеризации|Плотностный_алгоритм_кластеризации]], Выполняют: [[Участник:Ramon93i7|Шемякин Роман]], [[Участник:Dadrik|Вашуров Илья]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм CLOPE кластеризации категориальных данных]].&lt;br /&gt;
Выполняют: [[Участник:Артем_Карпухин|Карпухин Артем]], [[Участник:Артем_Желтков|Желтков Артем]].&lt;br /&gt;
&lt;br /&gt;
Статья: [[Участник:Борис/Алгоритм_Рунге-Кутты]]&lt;br /&gt;
Выполняет: [[Участник:Борис| Савков Борис]] и Степанов Евгений.&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм_кластеризации_категориальных_данных_CLOPE]].&lt;br /&gt;
Выполняют: [[Участник:Андрей_Туманов|А.Л.Туманов]], [[Участник:Александр_Александров|А.В.Александров]].&lt;/div&gt;</summary>
		<author><name>Андрей Туманов</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%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=16087</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=16087"/>
		<updated>2016-11-07T21:21:48Z</updated>

		<summary type="html">&lt;p&gt;Андрей Туманов: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&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>Андрей Туманов</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=16082</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=16082"/>
		<updated>2016-11-07T20:55:25Z</updated>

		<summary type="html">&lt;p&gt;Андрей Туманов: &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;
=== Ресурс параллелизма алгоритма ===&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>Андрей Туманов</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=16080</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=16080"/>
		<updated>2016-11-07T20:47:14Z</updated>

		<summary type="html">&lt;p&gt;Андрей Туманов: /* Литература */&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; &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;
=== Ресурс параллелизма алгоритма ===&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>Андрей Туманов</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=16079</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=16079"/>
		<updated>2016-11-07T20:47:02Z</updated>

		<summary type="html">&lt;p&gt;Андрей Туманов: /* Схема реализации последовательного алгоритма */&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; &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;
=== Ресурс параллелизма алгоритма ===&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>Андрей Туманов</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=16078</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=16078"/>
		<updated>2016-11-07T20:46:11Z</updated>

		<summary type="html">&lt;p&gt;Андрей Туманов: /* Математическое описание алгоритма */&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; &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;
Вычисления происходят до тех пор, пока за итерацию происходит хотя бы одно перемещение транзакции. Если за итерацию не было произведено ни одного перемещения, то текущее состояние кластеров является устойчивым и оптимальным.&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>Андрей Туманов</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=15694</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=15694"/>
		<updated>2016-11-01T21:16:15Z</updated>

		<summary type="html">&lt;p&gt;Андрей Туманов: /* Ресурс параллелизма алгоритма */&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;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&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>Андрей Туманов</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=15688</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=15688"/>
		<updated>2016-11-01T21:06:28Z</updated>

		<summary type="html">&lt;p&gt;Андрей Туманов: /* Входные и выходные данные алгоритма */&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;
=== Входные и выходные данные алгоритма ===&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;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&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>Андрей Туманов</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=15680</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=15680"/>
		<updated>2016-11-01T20:59:39Z</updated>

		<summary type="html">&lt;p&gt;Андрей Туманов: /* Схема реализации последовательного алгоритма */&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;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&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>Андрей Туманов</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=15674</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=15674"/>
		<updated>2016-11-01T20:55:54Z</updated>

		<summary type="html">&lt;p&gt;Андрей Туманов: /* Последовательная сложность алгоритма */&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;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&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>Андрей Туманов</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=14971</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=14971"/>
		<updated>2016-10-30T22:09:03Z</updated>

		<summary type="html">&lt;p&gt;Андрей Туманов: /* Существующие реализации алгоритма */&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;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&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>Андрей Туманов</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=14969</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=14969"/>
		<updated>2016-10-30T22:02:36Z</updated>

		<summary type="html">&lt;p&gt;Андрей Туманов: /* Вычислительное ядро алгоритма */&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;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] 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>Андрей Туманов</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=14965</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=14965"/>
		<updated>2016-10-30T21:48:12Z</updated>

		<summary type="html">&lt;p&gt;Андрей Туманов: /* Схема реализации последовательного алгоритма */&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; 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;
=== Макроструктура алгоритма ===&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;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] 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>Андрей Туманов</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=14957</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=14957"/>
		<updated>2016-10-30T21:26:21Z</updated>

		<summary type="html">&lt;p&gt;Андрей Туманов: /* Схема реализации последовательного алгоритма */&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; 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;
=== Макроструктура алгоритма ===&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;
&#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.C&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.N+1) / (W_new ^ r) - (C.S * C.N) / (C.W ^ 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.N-1) / (W_new ^ r) - (C.S * C.N) / (C.W ^ r)&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] 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>Андрей Туманов</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=14926</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=14926"/>
		<updated>2016-10-30T19:52:52Z</updated>

		<summary type="html">&lt;p&gt;Андрей Туманов: /* Схема реализации последовательного алгоритма */&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; 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;
=== Макроструктура алгоритма ===&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;
&#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 = False&lt;br /&gt;
    &#039;&#039;&#039;while&#039;&#039;&#039; 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.C&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.N+1) / (W_new ^ r) - (C.S * C.N) / (C.W ^ 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_i:&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.N-1) / (W_new ^ r) - (C.S * C.N) / (C.W ^ r)&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] 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>Андрей Туманов</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=14899</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=14899"/>
		<updated>2016-10-30T18:36:14Z</updated>

		<summary type="html">&lt;p&gt;Андрей Туманов: /* Макроструктура алгоритма */&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; 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;
=== Макроструктура алгоритма ===&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;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] 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>Андрей Туманов</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=13615</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=13615"/>
		<updated>2016-10-24T21:42:01Z</updated>

		<summary type="html">&lt;p&gt;Андрей Туманов: /* Вычислительное ядро алгоритма */&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; 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;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] 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>Андрей Туманов</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=13614</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=13614"/>
		<updated>2016-10-24T21:29:31Z</updated>

		<summary type="html">&lt;p&gt;Андрей Туманов: /* Литература */&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;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] 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>Андрей Туманов</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=13613</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=13613"/>
		<updated>2016-10-24T21:28:41Z</updated>

		<summary type="html">&lt;p&gt;Андрей Туманов: /* Общее описание алгоритма */&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;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] 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;/div&gt;</summary>
		<author><name>Андрей Туманов</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%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=13612</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=13612"/>
		<updated>2016-10-24T21:14:06Z</updated>

		<summary type="html">&lt;p&gt;Андрей Туманов: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть имеется база транзакций &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;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] 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;/div&gt;</summary>
		<author><name>Андрей Туманов</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%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=13611</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=13611"/>
		<updated>2016-10-24T20:34:20Z</updated>

		<summary type="html">&lt;p&gt;Андрей Туманов: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть имеется база транзакций &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;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1]&lt;/div&gt;</summary>
		<author><name>Андрей Туманов</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%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=13610</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=13610"/>
		<updated>2016-10-24T20:33:22Z</updated>

		<summary type="html">&lt;p&gt;Андрей Туманов: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть имеется база транзакций &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;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1]&lt;/div&gt;</summary>
		<author><name>Андрей Туманов</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%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=13555</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=13555"/>
		<updated>2016-10-23T19:40:49Z</updated>

		<summary type="html">&lt;p&gt;Андрей Туманов: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1]&lt;/div&gt;</summary>
		<author><name>Андрей Туманов</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%90%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=13547</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=13547"/>
		<updated>2016-10-23T19:22:56Z</updated>

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