<?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=Andrey.muntanion</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=Andrey.muntanion"/>
	<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/Andrey.muntanion"/>
	<updated>2026-10-23T07:50:00Z</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%9F%D0%B8%D1%81%D0%BA%D1%83%D0%BD%D0%BE%D0%B2_%D0%9A%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82%D0%B8%D0%BD/_%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_(Clustering_with_sLOPE,_CLOPE)&amp;diff=22571</id>
		<title>Участник:Пискунов Константин/ Алгоритм кластеризации категориальных данных (Clustering with sLOPE, 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%9F%D0%B8%D1%81%D0%BA%D1%83%D0%BD%D0%BE%D0%B2_%D0%9A%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82%D0%B8%D0%BD/_%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_(Clustering_with_sLOPE,_CLOPE)&amp;diff=22571"/>
		<updated>2017-04-28T11:32:26Z</updated>

		<summary type="html">&lt;p&gt;Andrey.muntanion: исправлена ссылка на источник&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм CLOPE&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(N*k*A)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(N*A)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(N*k*A)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;N*A+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Final|К.А.Пискунов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Задачи кластеризации больших массивов категорийных данных весьма актуальна для систем анализа данных. Категорийные данные встречаются в любых областях: производство, коммерция, маркетинг, медицина… Категорийные данные включают в себя и так называемые транзакционные данные: чеки в супермаркетах, логи посещений веб-ресурсов. Сюда же относится анализ и классификация текстовых документов (Text Mining). &amp;lt;ref&amp;gt; &amp;quot;Кластеризация категорийных данных: масштабируемый алгоритм CLOPE&amp;quot; https://basegroup.ru/community/articles/clope&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь и далее под категорийными данными понимаются качественные характеристики объектов, измеренные в шкале наименований. Напомним: при использовании шкалы наименований указывается только, одинаковы или нет объекты относительно измеряемого признака.&lt;br /&gt;
&lt;br /&gt;
Алгоритм CLOPE. Предназначен для кластеризации огромных наборов категорийных данных. К достоинствам относятся высокие масштабируемость и скорость работы и качество кластеризации, что достигается использованием глобального критерия оптимизации на основе максимизации градиента высоты гистограммы кластера. Отличается простотой программной реализации. Во время работы алгоритм хранит в памяти небольшое количество информации по каждому кластеру и требует минимальное число сканирований набора данных. CLOPE автоматически подбирает количество кластеров, причем это регулируется одним единственным параметром   коэффициентом отталкивания. CLOPE предложен в 2002 году группой китайских ученых &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;
Во время работы в оперативной памяти хранится только текущая транзакция и небольшое количество информации по каждому кластеру, которая состоит из: количества транзакций N, числа уникальных объектов (или ширины кластера) W, простой хэш-таблицы для расчета Occ(i,C) и значения S площади кластера.&lt;br /&gt;
&lt;br /&gt;
Во время работы алгоритм хранит в RAM небольшое количество информации по каждому кластеру и требует минимальное число сканирований набора данных. CLOPE автоматически подбирает количество кластеров, причем это регулируется одним единственным параметром – коэффициентом отталкивания.&lt;br /&gt;
&lt;br /&gt;
В основе алгоритма кластеризации CLOPE лежит идея максимизации глобальной функции стоимости, которая повышает близость транзакций в кластерах при помощи увеличения параметра кластерной гистограммы&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_A\} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&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 \ldots \cup C_k = \{t_1,...,t_n\}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\ne&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\empty&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\land&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\cap&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;C_j= \empty&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\le&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; j&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; \le&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Каждый элемент &amp;lt;math&amp;gt; C_i&amp;lt;/math&amp;gt; называется &#039;&#039;кластером&#039;&#039;    , &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; — количество транзакций, &amp;lt;math&amp;gt;A &amp;lt;/math&amp;gt; — длина транзакции, &amp;lt;math&amp;gt;k &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;
Характеристики кластера &amp;lt;math&amp;gt;C_j &amp;lt;/math&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;D(C_j)&amp;lt;/math&amp;gt; — множество уникальных объектов;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Occ(i,C_j) &amp;lt;/math&amp;gt; — количество вхождений объекта &amp;lt;math&amp;gt; i&amp;lt;/math&amp;gt; в кластер &amp;lt;math&amp;gt; C_j&amp;lt;/math&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;S(C_j) = \sum_{i \in D(C_j)} Occ(i,C_j) = \sum _{t_i \in C_j} \mid t_i \mid &amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;W(C_j) &amp;lt;/math&amp;gt; &amp;amp;nbsp;=&amp;amp;nbsp; &amp;lt;math&amp;gt; \mid&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;D(C_j)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\mid&amp;lt;/math&amp;gt; — высота кластера;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H(C_j)&amp;lt;/math&amp;gt; = &amp;lt;math&amp;gt;S(C_j)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;W(C_j)&amp;lt;/math&amp;gt; — ширина кластера.&lt;br /&gt;
&lt;br /&gt;
Формула для вычисления глобального критерия — функции стоимости текущей кластеризации &amp;lt;math&amp;gt;C = \{C_1, \ldots C_k\}&amp;lt;/math&amp;gt;, обозначаемой, как &amp;lt;math&amp;gt; Profit(C)&amp;lt;/math&amp;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} &amp;lt;/math&amp;gt; &amp;amp;nbsp;=&amp;amp;nbsp; &amp;lt;math&amp;gt;\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; Profit(C)&amp;lt;/math&amp;gt; была максимальной.&lt;br /&gt;
&lt;br /&gt;
Далее происходят &amp;quot;уточняющие&amp;quot; проходы (фаза итерации), где для каждой транзакции производится попытка перемещения в другой кластер так, чтобы &amp;lt;math&amp;gt; Profit(C) \longrightarrow max&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
Если больше не существует перемещений транзакций, увеличивающих глобальную стоимость &amp;lt;math&amp;gt; Profit(C) &amp;lt;/math&amp;gt;, то действие алгоритма заканчивается. &amp;lt;ref&amp;gt; Нейский И.М. Классификация и сравнение методов кластеризации.  http://it-claim.ru/Persons/Neyskiy/Article2_Neiskiy.pdf &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит в многократном вычислении цены добавления и удаления транзакции, которые выполняются на каждой итерации для каждой транзакции — выражения &amp;lt;math&amp;gt;Cost^{\pm}(C_i, t_n) = \frac{\overline{S} (C_i) * (|C_i| \pm 1)}{\overline{W}(C_i)^r} - \frac{S(C_i) * |C_i|}{W(C_i)^r}&amp;lt;/math&amp;gt; &amp;amp;nbsp; (2 операции умножения, 2 операции деления, 2 возведения в степень и 1 инкремент/декремент)&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]], основную часть метода составляют вычисление цены добавления/удаления транзакции.&lt;br /&gt;
&lt;br /&gt;
В инициализации происходит распределение по кластерам, далее происходят итерации максимизирующие функцию стоимости и так происходит обход до тех пор, пока не перестанут происходить изменения.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть поисковые профили хранятся в таблице базы данных. Для построения начального разбиения, определяемого функцией Profit(C,r) требуется первый проход по таблице профилей. После этого требуется незначительное (1-3) количество дополнительных сканирований таблицы для повышения качества кластеризации и оптимизации функции стоимости. Если в текущем проходе по таблице, изменений не произошло, то алгоритм прекращает свою работу.&lt;br /&gt;
При построении начального разбиения из таблицы читается очередной профиль и создается новый кластер (отдельная таблица) или помещается в уже существующий кластер, который дает максимум Profit(C,r).&lt;br /&gt;
На итерационном этапе просматривается таблица профилей и для каждого профиля решается задача определения кластера, если новый кластер  максимизирует Profit(C,r), то профиль переносится в этот кластер. В начале каждого цикла устанавливается индикатор перемещения moved := false. Если в цикле происходит перемещение профиля индикатор перемещения изменяется moved :=true. Итерации завершаются, если значение moved=false не изменится. После завершения итераций удаляются все пустые кластеры.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть средняя длина транзакции равна A, общее число транзакций N, максимально возможное число кластеров K. Временная сложность одной итерации равна O(N*K*A), (что вытекает из количества операций согласно [[#Вычислительное ядро алгоритма|описанию вычислительного ядра алгоритма]]), показывающая, что скорость работы алгоритма растет линейно с ростом кластеров и размера таблицы. Это делает алгоритм быстрым и эффективным на больших объемах.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
На Рис.1 общая схема реализации алгоритма.&lt;br /&gt;
На входе у нас имеется следующий набор: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; транзакций длины &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и коэффициент отталкивания &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;.&lt;br /&gt;
Во время &amp;quot;Инициаллизации&amp;quot; происходит распределение транзакций по кластерам. Далее происходит проверка до тех пор, пока происходят перемещения, ведущие к увеличению общей стоимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:CLOPE.jpg|thumb|center|500px|Рис.1. Общая схема CLOPE]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подробнее рассмотрим стадию &amp;quot;Инициаллизации&amp;quot;.&lt;br /&gt;
В схематичном описании на Рис. 2 пара транзакций на входе, далее подсчет стоимости их добавления на один из кластеров или через пустой кластер осуществляется перемещение транзакций на новый кластер. Фаза с удалением транзакции с кластера включает еще и стоимость удаления, поэтому представлен граф только для добавления.&lt;br /&gt;
&lt;br /&gt;
[[file:Inf Gra.jpg|thumb|center|500px|Рис.2. Cтадия &amp;quot;Инициаллизации&amp;quot;]]&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;A&amp;lt;/math&amp;gt;, тогда сложность параллельного алгоритма будет &amp;lt;math&amp;gt;O(N*A)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* набор из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; транзакций длины не более &amp;lt;math&amp;gt;A&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;
* &amp;lt;math&amp;gt;N * A&amp;lt;/math&amp;gt; символов, строк или чисел (зависит от того, в каком виде представляются категории) и &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; вещественное число..&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* распределение исходного набора транзакций по кластерам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &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;
Соотношение последовательной и параллельной сложности является линейной: k.&lt;br /&gt;
&lt;br /&gt;
При этом вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – линейна.&lt;br /&gt;
&lt;br /&gt;
Алгоритм не устойчив из-за того, что результат его работы зависит от начального распределения по кластерам. А так как алгоритм зависит от порядка обхода кластеров, то строго нельзя говорить и о его детерминированности. &lt;br /&gt;
&lt;br /&gt;
В связи с ориентиром на категориальные данные, алгоритм не предназначен к работе с числами. (Большая разница в числах отнесет их к разным категориям.)&lt;br /&gt;
&lt;br /&gt;
Обеспечивает более высокую производительность и лучшее качество кластеризации в сравнении с многими иерархическими алгоритмами.&lt;br /&gt;
&lt;br /&gt;
К достоинствам относятся высокие масштабируемость и скорость работы и качество кластеризации, что достигается использованием глобального критерия оптимизации на основе максимизации градиента высоты гистограммы кластера.&lt;br /&gt;
&lt;br /&gt;
Во время работы алгоритм хранит в RAM небольшое количество информации по каждому кластеру и требует минимальное число сканирований набора данных. CLOPE автоматически подбирает количество кластеров, причем это регулируется одним единственным параметром – коэффициентом отталкивания.&lt;br /&gt;
&lt;br /&gt;
Количество итераций может быть задано пользователем, а может остаться не известным. Второе лучше отразится на качестве кластеризации, но не будет известно количество итераций.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Поскольку алгоритм CLOPE является достаточно новым, то сейчас нет его массовой реализации, как и в отечественных, так и западных пакетах.&lt;br /&gt;
&lt;br /&gt;
[http://weka.sourceforge.net/doc.stable/weka/clusterers/CLOPE.html WEKA] - библиотека алгоритмов машинного обучения и анализа данных на языке Java.&lt;br /&gt;
&lt;br /&gt;
Имеются частные пользовательские реализации алгоритма.&lt;br /&gt;
&lt;br /&gt;
Имеются публикации, посвященные данному алгоритму:&lt;br /&gt;
&lt;br /&gt;
* Wang, K., Xu, C.. Liu, B. Clustering transactions using large items. In Proc. CIKM’99, Kansas, Missouri, 1999.&lt;br /&gt;
&lt;br /&gt;
* Fasulo D. «An Analysis Of Recent Work on Clustering Algorithms». Department of Computer Science &amp;amp; Engineering.» / D. Fasulo// University of Washington,1999.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Andrey.muntanion</name></author>
	</entry>
</feed>