<?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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2+%D0%98%D0%BB%D1%8C%D1%8F+%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2+%D0%98%D0%BB%D1%8C%D1%8F+%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87"/>
	<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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87"/>
	<updated>2026-10-23T17:11:42Z</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=21208</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=21208"/>
		<updated>2016-12-18T15:55:36Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|{{REVISIONUSER}}}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(cK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(nK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(c(K+n))&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]] (1.1-1.4, 2.7, 2.4), [[Участник:Темербекова_Гульгайша|Гульгайша Темербекова]] (1.5-1.10, 3, 2.4)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
&lt;br /&gt;
1.&#039;&#039;&#039;Инициализация: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Случайным образом определяются C векторов - центров кластеров&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;
3. &#039;&#039;&#039;Расчет оценочной функции:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Переопределение кластерных центров&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма &amp;lt;ref&amp;gt;Arabinda Panda &amp;amp; Satchidananda Dehuri. Hard C-means Clustering Algorithm in Gene Expression Data // International Journal on Advanced Computer Theory and Engineering, ISSN-PRINT: 2319-2526. - 2013. - v. 2. - p. 35-39 [http://www.irdindia.in/journal_ijacte/pdf/vol2_iss1/8.pdf]&amp;lt;/ref&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество наборов в &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;c_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{1}, c^*_{2}, ... c^*_{c}, M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{c} \sum_{u_{i} \in c_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;u_{1},u_{2}, ... u_{K}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; c_{1},c_{2},...,c_{c}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K)\\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; c^*_{j} = \frac{1}{|c_{j}|} \sum_{u_{i} \in c_{j}}^{} c_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;|c_{j}| &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру &amp;lt;math&amp;gt;c_{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром данного алгоритма является вычисление на каждой итерации алгоритма квадратов норм между кластерными центрами и векторами из входного набор согласно формуле &amp;lt;math&amp;gt;\|u_k-c_i\|^2&amp;lt;/math&amp;gt;. На каждой итерации алгоритма происходит &amp;lt;math&amp;gt;cK&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;&lt;br /&gt;
\|u_k-c_i\|^2&lt;br /&gt;
&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;J=\sum_{j = 1}^{c} \sum_{u_{i} \in C_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&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; c^*_{j} = \frac{1}{|c_{j}|} \sum_{u_{i} \in c_{j}}^{} u_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая &amp;lt;ref&amp;gt; Jyh-Shing Roger Jang, Chuen-Tsai Sun, Eiji Mizutani. Neuro-fuzzy and soft computing: a computational approach to learning and machine intelligence. Prentice-Hall, Inc. Simon &amp;amp; Schuster/A Viacom Company Upper Saddle River, NJ 07458. - 1997. - p. 424. [http://it-claim.ru/Persons/Neyskiy/Article2_Neiskiy.pdf]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in c_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|c_i|} \sum\limits_{k:\, u_k \in c_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|c_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c-1)&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt; Pawan Kumar, Mr. Pankaj Verma, Rakesh Sharma. Comparative analysis of Fuzzy C-mean and Hard C-mean algorithm // International Journal of information Technology and Knowledge Management. - July-December 2010. - v. 2 [http://csjournals.com/IJITKM/PDF%203-1/39.pdf]&amp;lt;/ref&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход в &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 1. &#039;&#039;&#039;&#039;&#039;in&#039;&#039;&#039;&#039;&#039; - входные данные, &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - вычисление расстояния до кластерных центров и значение &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; единое для каждой группы &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - нахождение минимального расстояния до кластерных центров, &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - запись единички в столбец матрицы, &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - расчёт объектной функции, &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; — пересчёт кластерных центров, &#039;&#039;&#039;&#039;&#039;out&#039;&#039;&#039;&#039;&#039; — вывод полученных данных.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для одной итерации алгоритма в параллельном варианте требуется &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; раз последовательно выполнить для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; операций нахождения расстояния от элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
* &amp;lt;math&amp;gt;C-1&amp;lt;/math&amp;gt; сравнений, для нахождения минимального расстояния.&lt;br /&gt;
* операция записи единички в столбец матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Основным ресурсом алгоритма является вычисление квадрата нормы для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt;. Расчёт значения объектной функции &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; сложно представить в параллельном варианте, поэтому вычисление объектной функции производится последовательно.Использование параллельной реализации алгоритма приведёт к понижению производительности при небольшой размерности системы и малом объеме выборки. При параллельном варианте необходима пересылка данных, что при малом объеме выборки и небольшой размерности займет больше времени, чем при последовательном варианте.&lt;br /&gt;
Как легко видеть из информационного графа, высота [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] составляет &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;, ширина ЯПФ составляет &amp;lt;math&amp;gt;O(cK)&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;
# &amp;lt;math&amp;gt;\{u_k\}_{k=1}^{K}&amp;lt;/math&amp;gt; — исходный набор векторов, принадлежащие пространству &amp;lt;math&amp;gt;\mathbb{R}^n&amp;lt;/math&amp;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; &amp;lt;math&amp;gt;nK&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;M&amp;lt;/math&amp;gt; — матрица, принадлежащая пространству &amp;lt;math&amp;gt;\mathbb{R}^{c \times K}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &amp;lt;math&amp;gt;\{c^*_i\}_{i=1}^{c}&amp;lt;/math&amp;gt; — набор построенных кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;c(K+n)&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;
&#039;&#039;&#039;Достоинства:&#039;&#039;&#039; легкость реализации,вычислительная простота.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039; задание количества кластеров,отсутствие гарантии в нахождении оптимального решения.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации алгоритма Hard C - Means (HCM). Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета] с пиковой производительностью 1,7 Пфлопс, число процессоров/ядер x86: 12 346 / 52 168. Программа написана на языке C с использованием [https://parallel.ru/cluster/lomonosov_howto MPI], не использовалось дополнительных опций. Использовалась следующая [https://github.com/cNikolaou/mpi-kmeans параллельная реализация алгоритма HCM].&lt;br /&gt;
Компилятор: gcc.&lt;br /&gt;
Версия MPI - intel openmpi/1.8.4-icc.&lt;br /&gt;
Модель используемого CPU - Intel Xeon X5570 2.93GHz.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число ядер &amp;lt;math&amp;gt;[16 : 256]&amp;lt;/math&amp;gt; с шагом по степеням двойки;&lt;br /&gt;
*	объём выборки &amp;lt;math&amp;gt;[10^3:10^7]&amp;lt;/math&amp;gt;  с шагом по степеням десятки;&lt;br /&gt;
&lt;br /&gt;
На рисунке приведена параллельная реализация алгоритма Hard C - Means (HCM). Изменение вычислительного времени алгоритма в зависимости от числа ядер и размера исходных данных. &lt;br /&gt;
&lt;br /&gt;
[[Файл:scheme1.png]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*  [https://github.com/artpar/Hard-Clustering-implementation Последовательная реализация на С++ ]&lt;br /&gt;
&lt;br /&gt;
*  [http://projects.jasmeet.me/2013/03/HardCMeans.html Последовательная реализация на MatLab ]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=21206</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=21206"/>
		<updated>2016-12-18T15:55:04Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|{{REVISIONUSER}}}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(cK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(nK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(c(K+n))&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]] (1.1-1.4, 2.7, 2.4), [[Участник:Темербекова_Гульгайша|Гульгайша Темербекова]] (1.5-1.10, 3, 2.4)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
&lt;br /&gt;
1.&#039;&#039;&#039;Инициализация: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Случайным образом определяются C векторов - центров кластеров&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;
3. &#039;&#039;&#039;Расчет оценочной функции:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Переопределение кластерных центров&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма &amp;lt;ref&amp;gt;Arabinda Panda &amp;amp; Satchidananda Dehuri. Hard C-means Clustering Algorithm in Gene Expression Data // International Journal on Advanced Computer Theory and Engineering, ISSN-PRINT: 2319-2526. - 2013. - v. 2. - p. 35-39 [http://www.irdindia.in/journal_ijacte/pdf/vol2_iss1/8.pdf]&amp;lt;/ref&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество наборов в &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;c_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{1}, c^*_{2}, ... c^*_{c}, M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{c} \sum_{u_{i} \in c_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;u_{1},u_{2}, ... u_{K}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; c_{1},c_{2},...,c_{c}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K)\\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; c^*_{j} = \frac{1}{|c_{j}|} \sum_{u_{i} \in c_{j}}^{} c_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;|c_{j}| &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру &amp;lt;math&amp;gt;c_{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром данного алгоритма является вычисление на каждой итерации алгоритма квадратов норм между кластерными центрами и векторами из входного набор согласно формуле &amp;lt;math&amp;gt;\|u_k-c_i\|^2&amp;lt;/math&amp;gt;. На каждой итерации алгоритма происходит &amp;lt;math&amp;gt;cK&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;&lt;br /&gt;
\|u_k-c_i\|^2&lt;br /&gt;
&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;J=\sum_{j = 1}^{c} \sum_{u_{i} \in C_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&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; c^*_{j} = \frac{1}{|c_{j}|} \sum_{u_{i} \in c_{j}}^{} u_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая &amp;lt;ref&amp;gt; Jyh-Shing Roger Jang, Chuen-Tsai Sun, Eiji Mizutani. Neuro-fuzzy and soft computing: a computational approach to learning and machine intelligence. Prentice-Hall, Inc. Simon &amp;amp; Schuster/A Viacom Company Upper Saddle River, NJ 07458. - 1997. - p. 424. [http://it-claim.ru/Persons/Neyskiy/Article2_Neiskiy.pdf]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in c_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c-1)&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt; Pawan Kumar, Mr. Pankaj Verma, Rakesh Sharma. Comparative analysis of Fuzzy C-mean and Hard C-mean algorithm // International Journal of information Technology and Knowledge Management. - July-December 2010. - v. 2 [http://csjournals.com/IJITKM/PDF%203-1/39.pdf]&amp;lt;/ref&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход в &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 1. &#039;&#039;&#039;&#039;&#039;in&#039;&#039;&#039;&#039;&#039; - входные данные, &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - вычисление расстояния до кластерных центров и значение &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; единое для каждой группы &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - нахождение минимального расстояния до кластерных центров, &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - запись единички в столбец матрицы, &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - расчёт объектной функции, &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; — пересчёт кластерных центров, &#039;&#039;&#039;&#039;&#039;out&#039;&#039;&#039;&#039;&#039; — вывод полученных данных.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для одной итерации алгоритма в параллельном варианте требуется &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; раз последовательно выполнить для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; операций нахождения расстояния от элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
* &amp;lt;math&amp;gt;C-1&amp;lt;/math&amp;gt; сравнений, для нахождения минимального расстояния.&lt;br /&gt;
* операция записи единички в столбец матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Основным ресурсом алгоритма является вычисление квадрата нормы для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt;. Расчёт значения объектной функции &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; сложно представить в параллельном варианте, поэтому вычисление объектной функции производится последовательно.Использование параллельной реализации алгоритма приведёт к понижению производительности при небольшой размерности системы и малом объеме выборки. При параллельном варианте необходима пересылка данных, что при малом объеме выборки и небольшой размерности займет больше времени, чем при последовательном варианте.&lt;br /&gt;
Как легко видеть из информационного графа, высота [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] составляет &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;, ширина ЯПФ составляет &amp;lt;math&amp;gt;O(cK)&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;
# &amp;lt;math&amp;gt;\{u_k\}_{k=1}^{K}&amp;lt;/math&amp;gt; — исходный набор векторов, принадлежащие пространству &amp;lt;math&amp;gt;\mathbb{R}^n&amp;lt;/math&amp;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; &amp;lt;math&amp;gt;nK&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;M&amp;lt;/math&amp;gt; — матрица, принадлежащая пространству &amp;lt;math&amp;gt;\mathbb{R}^{c \times K}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &amp;lt;math&amp;gt;\{c^*_i\}_{i=1}^{c}&amp;lt;/math&amp;gt; — набор построенных кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;c(K+n)&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;
&#039;&#039;&#039;Достоинства:&#039;&#039;&#039; легкость реализации,вычислительная простота.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039; задание количества кластеров,отсутствие гарантии в нахождении оптимального решения.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации алгоритма Hard C - Means (HCM). Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета] с пиковой производительностью 1,7 Пфлопс, число процессоров/ядер x86: 12 346 / 52 168. Программа написана на языке C с использованием [https://parallel.ru/cluster/lomonosov_howto MPI], не использовалось дополнительных опций. Использовалась следующая [https://github.com/cNikolaou/mpi-kmeans параллельная реализация алгоритма HCM].&lt;br /&gt;
Компилятор: gcc.&lt;br /&gt;
Версия MPI - intel openmpi/1.8.4-icc.&lt;br /&gt;
Модель используемого CPU - Intel Xeon X5570 2.93GHz.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число ядер &amp;lt;math&amp;gt;[16 : 256]&amp;lt;/math&amp;gt; с шагом по степеням двойки;&lt;br /&gt;
*	объём выборки &amp;lt;math&amp;gt;[10^3:10^7]&amp;lt;/math&amp;gt;  с шагом по степеням десятки;&lt;br /&gt;
&lt;br /&gt;
На рисунке приведена параллельная реализация алгоритма Hard C - Means (HCM). Изменение вычислительного времени алгоритма в зависимости от числа ядер и размера исходных данных. &lt;br /&gt;
&lt;br /&gt;
[[Файл:scheme1.png]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*  [https://github.com/artpar/Hard-Clustering-implementation Последовательная реализация на С++ ]&lt;br /&gt;
&lt;br /&gt;
*  [http://projects.jasmeet.me/2013/03/HardCMeans.html Последовательная реализация на MatLab ]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=21204</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=21204"/>
		<updated>2016-12-18T15:54:04Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|{{REVISIONUSER}}}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(cK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(nK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(c(K+n))&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]] (1.1-1.4, 2.7, 2.4), [[Участник:Темербекова_Гульгайша|Гульгайша Темербекова]] (1.5-1.10, 3, 2.4)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
&lt;br /&gt;
1.&#039;&#039;&#039;Инициализация: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Случайным образом определяются C векторов - центров кластеров&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;
3. &#039;&#039;&#039;Расчет оценочной функции:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Переопределение кластерных центров&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма &amp;lt;ref&amp;gt;Arabinda Panda &amp;amp; Satchidananda Dehuri. Hard C-means Clustering Algorithm in Gene Expression Data // International Journal on Advanced Computer Theory and Engineering, ISSN-PRINT: 2319-2526. - 2013. - v. 2. - p. 35-39 [http://www.irdindia.in/journal_ijacte/pdf/vol2_iss1/8.pdf]&amp;lt;/ref&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество наборов в &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;c_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{1}, c^*_{2}, ... c^*_{c}, M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{c} \sum_{u_{i} \in c_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;u_{1},u_{2}, ... u_{K}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; c_{1},c_{2},...,c_{c}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K)\\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; c^*_{j} = \frac{1}{|c_{j}|} \sum_{u_{i} \in c_{j}}^{} c_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;|c_{j}| &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру &amp;lt;math&amp;gt;c_{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром данного алгоритма является вычисление на каждой итерации алгоритма квадратов норм между кластерными центрами и векторами из входного набор согласно формуле &amp;lt;math&amp;gt;\|u_k-c_i\|^2&amp;lt;/math&amp;gt;. На каждой итерации алгоритма происходит &amp;lt;math&amp;gt;cK&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;&lt;br /&gt;
\|u_k-c_i\|^2&lt;br /&gt;
&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;J=\sum_{j = 1}^{c} \sum_{u_{i} \in C_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&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; c^*_{j} = \frac{1}{|c_{j}|} \sum_{u_{i} \in c_{j}}^{} u_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая &amp;lt;ref&amp;gt; Jyh-Shing Roger Jang, Chuen-Tsai Sun, Eiji Mizutani. Neuro-fuzzy and soft computing: a computational approach to learning and machine intelligence. Prentice-Hall, Inc. Simon &amp;amp; Schuster/A Viacom Company Upper Saddle River, NJ 07458. - 1997. - p. 424. [http://it-claim.ru/Persons/Neyskiy/Article2_Neiskiy.pdf]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c-1)&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt; Pawan Kumar, Mr. Pankaj Verma, Rakesh Sharma. Comparative analysis of Fuzzy C-mean and Hard C-mean algorithm // International Journal of information Technology and Knowledge Management. - July-December 2010. - v. 2 [http://csjournals.com/IJITKM/PDF%203-1/39.pdf]&amp;lt;/ref&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход в &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 1. &#039;&#039;&#039;&#039;&#039;in&#039;&#039;&#039;&#039;&#039; - входные данные, &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - вычисление расстояния до кластерных центров и значение &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; единое для каждой группы &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - нахождение минимального расстояния до кластерных центров, &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - запись единички в столбец матрицы, &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - расчёт объектной функции, &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; — пересчёт кластерных центров, &#039;&#039;&#039;&#039;&#039;out&#039;&#039;&#039;&#039;&#039; — вывод полученных данных.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для одной итерации алгоритма в параллельном варианте требуется &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; раз последовательно выполнить для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; операций нахождения расстояния от элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
* &amp;lt;math&amp;gt;C-1&amp;lt;/math&amp;gt; сравнений, для нахождения минимального расстояния.&lt;br /&gt;
* операция записи единички в столбец матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Основным ресурсом алгоритма является вычисление квадрата нормы для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt;. Расчёт значения объектной функции &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; сложно представить в параллельном варианте, поэтому вычисление объектной функции производится последовательно.Использование параллельной реализации алгоритма приведёт к понижению производительности при небольшой размерности системы и малом объеме выборки. При параллельном варианте необходима пересылка данных, что при малом объеме выборки и небольшой размерности займет больше времени, чем при последовательном варианте.&lt;br /&gt;
Как легко видеть из информационного графа, высота [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] составляет &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;, ширина ЯПФ составляет &amp;lt;math&amp;gt;O(cK)&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;
# &amp;lt;math&amp;gt;\{u_k\}_{k=1}^{K}&amp;lt;/math&amp;gt; — исходный набор векторов, принадлежащие пространству &amp;lt;math&amp;gt;\mathbb{R}^n&amp;lt;/math&amp;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; &amp;lt;math&amp;gt;nK&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;M&amp;lt;/math&amp;gt; — матрица, принадлежащая пространству &amp;lt;math&amp;gt;\mathbb{R}^{c \times K}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &amp;lt;math&amp;gt;\{c^*_i\}_{i=1}^{c}&amp;lt;/math&amp;gt; — набор построенных кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;c(K+n)&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;
&#039;&#039;&#039;Достоинства:&#039;&#039;&#039; легкость реализации,вычислительная простота.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039; задание количества кластеров,отсутствие гарантии в нахождении оптимального решения.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации алгоритма Hard C - Means (HCM). Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета] с пиковой производительностью 1,7 Пфлопс, число процессоров/ядер x86: 12 346 / 52 168. Программа написана на языке C с использованием [https://parallel.ru/cluster/lomonosov_howto MPI], не использовалось дополнительных опций. Использовалась следующая [https://github.com/cNikolaou/mpi-kmeans параллельная реализация алгоритма HCM].&lt;br /&gt;
Компилятор: gcc.&lt;br /&gt;
Версия MPI - intel openmpi/1.8.4-icc.&lt;br /&gt;
Модель используемого CPU - Intel Xeon X5570 2.93GHz.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число ядер &amp;lt;math&amp;gt;[16 : 256]&amp;lt;/math&amp;gt; с шагом по степеням двойки;&lt;br /&gt;
*	объём выборки &amp;lt;math&amp;gt;[10^3:10^7]&amp;lt;/math&amp;gt;  с шагом по степеням десятки;&lt;br /&gt;
&lt;br /&gt;
На рисунке приведена параллельная реализация алгоритма Hard C - Means (HCM). Изменение вычислительного времени алгоритма в зависимости от числа ядер и размера исходных данных. &lt;br /&gt;
&lt;br /&gt;
[[Файл:scheme1.png]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*  [https://github.com/artpar/Hard-Clustering-implementation Последовательная реализация на С++ ]&lt;br /&gt;
&lt;br /&gt;
*  [http://projects.jasmeet.me/2013/03/HardCMeans.html Последовательная реализация на MatLab ]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=21203</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=21203"/>
		<updated>2016-12-18T15:53:10Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Математическое описание алгоритма Arabinda Panda &amp;amp; Satchidananda Dehuri. Hard C-means Clustering Algorithm in Gene Expression Data // International Journal on Advanced Computer Theory and Engineering, ISSN-PRINT: 2319-…&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|{{REVISIONUSER}}}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(cK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(nK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(c(K+n))&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]] (1.1-1.4, 2.7, 2.4), [[Участник:Темербекова_Гульгайша|Гульгайша Темербекова]] (1.5-1.10, 3, 2.4)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
&lt;br /&gt;
1.&#039;&#039;&#039;Инициализация: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Случайным образом определяются C векторов - центров кластеров&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;
3. &#039;&#039;&#039;Расчет оценочной функции:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Переопределение кластерных центров&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма &amp;lt;ref&amp;gt;Arabinda Panda &amp;amp; Satchidananda Dehuri. Hard C-means Clustering Algorithm in Gene Expression Data // International Journal on Advanced Computer Theory and Engineering, ISSN-PRINT: 2319-2526. - 2013. - v. 2. - p. 35-39 [http://www.irdindia.in/journal_ijacte/pdf/vol2_iss1/8.pdf]&amp;lt;/ref&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество наборов в &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;c_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{1}, c^*_{2}, ... c^*_{c}, M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{c} \sum_{u_{i} \in c_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;u_{1},u_{2}, ... u_{K}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; c_{1},c_{2},...,c_{c}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K)\\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; c^*_{j} = \frac{1}{|c_{j}|} \sum_{u_{i} \in c_{j}}^{} c_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;|c_{j}| &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру &amp;lt;math&amp;gt;c_{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром данного алгоритма является вычисление на каждой итерации алгоритма квадратов норм между кластерными центрами и векторами из входного набор согласно формуле &amp;lt;math&amp;gt;\|u_k-c_i\|^2&amp;lt;/math&amp;gt;. На каждой итерации алгоритма происходит &amp;lt;math&amp;gt;cK&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;&lt;br /&gt;
\|u_k-c_i\|^2&lt;br /&gt;
&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;J=\sum_{j = 1}^{c} \sum_{u_{i} \in C_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&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; c^*_{j} = \frac{1}{|C_{j}|} \sum_{u_{i} \in C_{j}}^{} u_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая &amp;lt;ref&amp;gt; Jyh-Shing Roger Jang, Chuen-Tsai Sun, Eiji Mizutani. Neuro-fuzzy and soft computing: a computational approach to learning and machine intelligence. Prentice-Hall, Inc. Simon &amp;amp; Schuster/A Viacom Company Upper Saddle River, NJ 07458. - 1997. - p. 424. [http://it-claim.ru/Persons/Neyskiy/Article2_Neiskiy.pdf]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c-1)&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt; Pawan Kumar, Mr. Pankaj Verma, Rakesh Sharma. Comparative analysis of Fuzzy C-mean and Hard C-mean algorithm // International Journal of information Technology and Knowledge Management. - July-December 2010. - v. 2 [http://csjournals.com/IJITKM/PDF%203-1/39.pdf]&amp;lt;/ref&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход в &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 1. &#039;&#039;&#039;&#039;&#039;in&#039;&#039;&#039;&#039;&#039; - входные данные, &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - вычисление расстояния до кластерных центров и значение &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; единое для каждой группы &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - нахождение минимального расстояния до кластерных центров, &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - запись единички в столбец матрицы, &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - расчёт объектной функции, &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; — пересчёт кластерных центров, &#039;&#039;&#039;&#039;&#039;out&#039;&#039;&#039;&#039;&#039; — вывод полученных данных.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для одной итерации алгоритма в параллельном варианте требуется &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; раз последовательно выполнить для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; операций нахождения расстояния от элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
* &amp;lt;math&amp;gt;C-1&amp;lt;/math&amp;gt; сравнений, для нахождения минимального расстояния.&lt;br /&gt;
* операция записи единички в столбец матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Основным ресурсом алгоритма является вычисление квадрата нормы для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt;. Расчёт значения объектной функции &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; сложно представить в параллельном варианте, поэтому вычисление объектной функции производится последовательно.Использование параллельной реализации алгоритма приведёт к понижению производительности при небольшой размерности системы и малом объеме выборки. При параллельном варианте необходима пересылка данных, что при малом объеме выборки и небольшой размерности займет больше времени, чем при последовательном варианте.&lt;br /&gt;
Как легко видеть из информационного графа, высота [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] составляет &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;, ширина ЯПФ составляет &amp;lt;math&amp;gt;O(cK)&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;
# &amp;lt;math&amp;gt;\{u_k\}_{k=1}^{K}&amp;lt;/math&amp;gt; — исходный набор векторов, принадлежащие пространству &amp;lt;math&amp;gt;\mathbb{R}^n&amp;lt;/math&amp;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; &amp;lt;math&amp;gt;nK&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;M&amp;lt;/math&amp;gt; — матрица, принадлежащая пространству &amp;lt;math&amp;gt;\mathbb{R}^{c \times K}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &amp;lt;math&amp;gt;\{c^*_i\}_{i=1}^{c}&amp;lt;/math&amp;gt; — набор построенных кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;c(K+n)&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;
&#039;&#039;&#039;Достоинства:&#039;&#039;&#039; легкость реализации,вычислительная простота.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039; задание количества кластеров,отсутствие гарантии в нахождении оптимального решения.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации алгоритма Hard C - Means (HCM). Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета] с пиковой производительностью 1,7 Пфлопс, число процессоров/ядер x86: 12 346 / 52 168. Программа написана на языке C с использованием [https://parallel.ru/cluster/lomonosov_howto MPI], не использовалось дополнительных опций. Использовалась следующая [https://github.com/cNikolaou/mpi-kmeans параллельная реализация алгоритма HCM].&lt;br /&gt;
Компилятор: gcc.&lt;br /&gt;
Версия MPI - intel openmpi/1.8.4-icc.&lt;br /&gt;
Модель используемого CPU - Intel Xeon X5570 2.93GHz.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число ядер &amp;lt;math&amp;gt;[16 : 256]&amp;lt;/math&amp;gt; с шагом по степеням двойки;&lt;br /&gt;
*	объём выборки &amp;lt;math&amp;gt;[10^3:10^7]&amp;lt;/math&amp;gt;  с шагом по степеням десятки;&lt;br /&gt;
&lt;br /&gt;
На рисунке приведена параллельная реализация алгоритма Hard C - Means (HCM). Изменение вычислительного времени алгоритма в зависимости от числа ядер и размера исходных данных. &lt;br /&gt;
&lt;br /&gt;
[[Файл:scheme1.png]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*  [https://github.com/artpar/Hard-Clustering-implementation Последовательная реализация на С++ ]&lt;br /&gt;
&lt;br /&gt;
*  [http://projects.jasmeet.me/2013/03/HardCMeans.html Последовательная реализация на MatLab ]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=21202</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=21202"/>
		<updated>2016-12-18T15:51:05Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Математическое описание алгоритма Arabinda Panda &amp;amp; Satchidananda Dehuri. Hard C-means Clustering Algorithm in Gene Expression Data // International Journal on Advanced Computer Theory and Engineering, ISSN-PRINT: 2319-…&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|{{REVISIONUSER}}}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(cK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(nK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(c(K+n))&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]] (1.1-1.4, 2.7, 2.4), [[Участник:Темербекова_Гульгайша|Гульгайша Темербекова]] (1.5-1.10, 3, 2.4)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
&lt;br /&gt;
1.&#039;&#039;&#039;Инициализация: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Случайным образом определяются C векторов - центров кластеров&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;
3. &#039;&#039;&#039;Расчет оценочной функции:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Переопределение кластерных центров&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма &amp;lt;ref&amp;gt;Arabinda Panda &amp;amp; Satchidananda Dehuri. Hard C-means Clustering Algorithm in Gene Expression Data // International Journal on Advanced Computer Theory and Engineering, ISSN-PRINT: 2319-2526. - 2013. - v. 2. - p. 35-39 [http://www.irdindia.in/journal_ijacte/pdf/vol2_iss1/8.pdf]&amp;lt;/ref&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество наборов в &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;c_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{1}, c^*_{2}, ... c^*_{c}, M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{c} \sum_{u_{i} \in с_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;u_{1},u_{2}, ... u_{K}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; c_{1},c_{2},...,c_{c}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K)\\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; c^*_{j} = \frac{1}{|с_{j}|} \sum_{u_{i} \in с_{j}}^{} c_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;|с_{j}| &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру &amp;lt;math&amp;gt;с_{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром данного алгоритма является вычисление на каждой итерации алгоритма квадратов норм между кластерными центрами и векторами из входного набор согласно формуле &amp;lt;math&amp;gt;\|u_k-c_i\|^2&amp;lt;/math&amp;gt;. На каждой итерации алгоритма происходит &amp;lt;math&amp;gt;cK&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;&lt;br /&gt;
\|u_k-c_i\|^2&lt;br /&gt;
&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;J=\sum_{j = 1}^{c} \sum_{u_{i} \in C_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&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; c^*_{j} = \frac{1}{|C_{j}|} \sum_{u_{i} \in C_{j}}^{} u_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая &amp;lt;ref&amp;gt; Jyh-Shing Roger Jang, Chuen-Tsai Sun, Eiji Mizutani. Neuro-fuzzy and soft computing: a computational approach to learning and machine intelligence. Prentice-Hall, Inc. Simon &amp;amp; Schuster/A Viacom Company Upper Saddle River, NJ 07458. - 1997. - p. 424. [http://it-claim.ru/Persons/Neyskiy/Article2_Neiskiy.pdf]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c-1)&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt; Pawan Kumar, Mr. Pankaj Verma, Rakesh Sharma. Comparative analysis of Fuzzy C-mean and Hard C-mean algorithm // International Journal of information Technology and Knowledge Management. - July-December 2010. - v. 2 [http://csjournals.com/IJITKM/PDF%203-1/39.pdf]&amp;lt;/ref&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход в &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 1. &#039;&#039;&#039;&#039;&#039;in&#039;&#039;&#039;&#039;&#039; - входные данные, &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - вычисление расстояния до кластерных центров и значение &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; единое для каждой группы &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - нахождение минимального расстояния до кластерных центров, &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - запись единички в столбец матрицы, &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - расчёт объектной функции, &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; — пересчёт кластерных центров, &#039;&#039;&#039;&#039;&#039;out&#039;&#039;&#039;&#039;&#039; — вывод полученных данных.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для одной итерации алгоритма в параллельном варианте требуется &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; раз последовательно выполнить для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; операций нахождения расстояния от элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
* &amp;lt;math&amp;gt;C-1&amp;lt;/math&amp;gt; сравнений, для нахождения минимального расстояния.&lt;br /&gt;
* операция записи единички в столбец матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Основным ресурсом алгоритма является вычисление квадрата нормы для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt;. Расчёт значения объектной функции &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; сложно представить в параллельном варианте, поэтому вычисление объектной функции производится последовательно.Использование параллельной реализации алгоритма приведёт к понижению производительности при небольшой размерности системы и малом объеме выборки. При параллельном варианте необходима пересылка данных, что при малом объеме выборки и небольшой размерности займет больше времени, чем при последовательном варианте.&lt;br /&gt;
Как легко видеть из информационного графа, высота [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] составляет &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;, ширина ЯПФ составляет &amp;lt;math&amp;gt;O(cK)&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;
# &amp;lt;math&amp;gt;\{u_k\}_{k=1}^{K}&amp;lt;/math&amp;gt; — исходный набор векторов, принадлежащие пространству &amp;lt;math&amp;gt;\mathbb{R}^n&amp;lt;/math&amp;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; &amp;lt;math&amp;gt;nK&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;M&amp;lt;/math&amp;gt; — матрица, принадлежащая пространству &amp;lt;math&amp;gt;\mathbb{R}^{c \times K}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &amp;lt;math&amp;gt;\{c^*_i\}_{i=1}^{c}&amp;lt;/math&amp;gt; — набор построенных кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;c(K+n)&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;
&#039;&#039;&#039;Достоинства:&#039;&#039;&#039; легкость реализации,вычислительная простота.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039; задание количества кластеров,отсутствие гарантии в нахождении оптимального решения.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации алгоритма Hard C - Means (HCM). Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета] с пиковой производительностью 1,7 Пфлопс, число процессоров/ядер x86: 12 346 / 52 168. Программа написана на языке C с использованием [https://parallel.ru/cluster/lomonosov_howto MPI], не использовалось дополнительных опций. Использовалась следующая [https://github.com/cNikolaou/mpi-kmeans параллельная реализация алгоритма HCM].&lt;br /&gt;
Компилятор: gcc.&lt;br /&gt;
Версия MPI - intel openmpi/1.8.4-icc.&lt;br /&gt;
Модель используемого CPU - Intel Xeon X5570 2.93GHz.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число ядер &amp;lt;math&amp;gt;[16 : 256]&amp;lt;/math&amp;gt; с шагом по степеням двойки;&lt;br /&gt;
*	объём выборки &amp;lt;math&amp;gt;[10^3:10^7]&amp;lt;/math&amp;gt;  с шагом по степеням десятки;&lt;br /&gt;
&lt;br /&gt;
На рисунке приведена параллельная реализация алгоритма Hard C - Means (HCM). Изменение вычислительного времени алгоритма в зависимости от числа ядер и размера исходных данных. &lt;br /&gt;
&lt;br /&gt;
[[Файл:scheme1.png]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*  [https://github.com/artpar/Hard-Clustering-implementation Последовательная реализация на С++ ]&lt;br /&gt;
&lt;br /&gt;
*  [http://projects.jasmeet.me/2013/03/HardCMeans.html Последовательная реализация на MatLab ]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=21201</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=21201"/>
		<updated>2016-12-18T15:46:38Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Математическое описание алгоритма Arabinda Panda &amp;amp; Satchidananda Dehuri. Hard C-means Clustering Algorithm in Gene Expression Data // International Journal on Advanced Computer Theory and Engineering, ISSN-PRINT: 2319-…&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|{{REVISIONUSER}}}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(cK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(nK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(c(K+n))&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]] (1.1-1.4, 2.7, 2.4), [[Участник:Темербекова_Гульгайша|Гульгайша Темербекова]] (1.5-1.10, 3, 2.4)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
&lt;br /&gt;
1.&#039;&#039;&#039;Инициализация: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Случайным образом определяются C векторов - центров кластеров&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;
3. &#039;&#039;&#039;Расчет оценочной функции:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Переопределение кластерных центров&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма &amp;lt;ref&amp;gt;Arabinda Panda &amp;amp; Satchidananda Dehuri. Hard C-means Clustering Algorithm in Gene Expression Data // International Journal on Advanced Computer Theory and Engineering, ISSN-PRINT: 2319-2526. - 2013. - v. 2. - p. 35-39 [http://www.irdindia.in/journal_ijacte/pdf/vol2_iss1/8.pdf]&amp;lt;/ref&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество наборов в &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;c_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{1}, c^*_{2}, ... c^*_{c}, M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{c} \sum_{u_{i} \in C_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;u_{1},u_{2}, ... u_{K}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; c_{1},c_{2},...,c_{c}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K)\\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; c^*_{j} = \frac{1}{|C_{j}|} \sum_{u_{i} \in C_{j}}^{} c_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;|C_{j}| &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром данного алгоритма является вычисление на каждой итерации алгоритма квадратов норм между кластерными центрами и векторами из входного набор согласно формуле &amp;lt;math&amp;gt;\|u_k-c_i\|^2&amp;lt;/math&amp;gt;. На каждой итерации алгоритма происходит &amp;lt;math&amp;gt;cK&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;&lt;br /&gt;
\|u_k-c_i\|^2&lt;br /&gt;
&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;J=\sum_{j = 1}^{c} \sum_{u_{i} \in C_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&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; c^*_{j} = \frac{1}{|C_{j}|} \sum_{u_{i} \in C_{j}}^{} u_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая &amp;lt;ref&amp;gt; Jyh-Shing Roger Jang, Chuen-Tsai Sun, Eiji Mizutani. Neuro-fuzzy and soft computing: a computational approach to learning and machine intelligence. Prentice-Hall, Inc. Simon &amp;amp; Schuster/A Viacom Company Upper Saddle River, NJ 07458. - 1997. - p. 424. [http://it-claim.ru/Persons/Neyskiy/Article2_Neiskiy.pdf]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c-1)&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt; Pawan Kumar, Mr. Pankaj Verma, Rakesh Sharma. Comparative analysis of Fuzzy C-mean and Hard C-mean algorithm // International Journal of information Technology and Knowledge Management. - July-December 2010. - v. 2 [http://csjournals.com/IJITKM/PDF%203-1/39.pdf]&amp;lt;/ref&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход в &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 1. &#039;&#039;&#039;&#039;&#039;in&#039;&#039;&#039;&#039;&#039; - входные данные, &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - вычисление расстояния до кластерных центров и значение &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; единое для каждой группы &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - нахождение минимального расстояния до кластерных центров, &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - запись единички в столбец матрицы, &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - расчёт объектной функции, &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; — пересчёт кластерных центров, &#039;&#039;&#039;&#039;&#039;out&#039;&#039;&#039;&#039;&#039; — вывод полученных данных.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для одной итерации алгоритма в параллельном варианте требуется &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; раз последовательно выполнить для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; операций нахождения расстояния от элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
* &amp;lt;math&amp;gt;C-1&amp;lt;/math&amp;gt; сравнений, для нахождения минимального расстояния.&lt;br /&gt;
* операция записи единички в столбец матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Основным ресурсом алгоритма является вычисление квадрата нормы для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt;. Расчёт значения объектной функции &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; сложно представить в параллельном варианте, поэтому вычисление объектной функции производится последовательно.Использование параллельной реализации алгоритма приведёт к понижению производительности при небольшой размерности системы и малом объеме выборки. При параллельном варианте необходима пересылка данных, что при малом объеме выборки и небольшой размерности займет больше времени, чем при последовательном варианте.&lt;br /&gt;
Как легко видеть из информационного графа, высота [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] составляет &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;, ширина ЯПФ составляет &amp;lt;math&amp;gt;O(cK)&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;
# &amp;lt;math&amp;gt;\{u_k\}_{k=1}^{K}&amp;lt;/math&amp;gt; — исходный набор векторов, принадлежащие пространству &amp;lt;math&amp;gt;\mathbb{R}^n&amp;lt;/math&amp;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; &amp;lt;math&amp;gt;nK&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;M&amp;lt;/math&amp;gt; — матрица, принадлежащая пространству &amp;lt;math&amp;gt;\mathbb{R}^{c \times K}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &amp;lt;math&amp;gt;\{c^*_i\}_{i=1}^{c}&amp;lt;/math&amp;gt; — набор построенных кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;c(K+n)&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;
&#039;&#039;&#039;Достоинства:&#039;&#039;&#039; легкость реализации,вычислительная простота.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039; задание количества кластеров,отсутствие гарантии в нахождении оптимального решения.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации алгоритма Hard C - Means (HCM). Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета] с пиковой производительностью 1,7 Пфлопс, число процессоров/ядер x86: 12 346 / 52 168. Программа написана на языке C с использованием [https://parallel.ru/cluster/lomonosov_howto MPI], не использовалось дополнительных опций. Использовалась следующая [https://github.com/cNikolaou/mpi-kmeans параллельная реализация алгоритма HCM].&lt;br /&gt;
Компилятор: gcc.&lt;br /&gt;
Версия MPI - intel openmpi/1.8.4-icc.&lt;br /&gt;
Модель используемого CPU - Intel Xeon X5570 2.93GHz.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число ядер &amp;lt;math&amp;gt;[16 : 256]&amp;lt;/math&amp;gt; с шагом по степеням двойки;&lt;br /&gt;
*	объём выборки &amp;lt;math&amp;gt;[10^3:10^7]&amp;lt;/math&amp;gt;  с шагом по степеням десятки;&lt;br /&gt;
&lt;br /&gt;
На рисунке приведена параллельная реализация алгоритма Hard C - Means (HCM). Изменение вычислительного времени алгоритма в зависимости от числа ядер и размера исходных данных. &lt;br /&gt;
&lt;br /&gt;
[[Файл:scheme1.png]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*  [https://github.com/artpar/Hard-Clustering-implementation Последовательная реализация на С++ ]&lt;br /&gt;
&lt;br /&gt;
*  [http://projects.jasmeet.me/2013/03/HardCMeans.html Последовательная реализация на MatLab ]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=21200</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=21200"/>
		<updated>2016-12-18T15:45:32Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Математическое описание алгоритма Arabinda Panda &amp;amp; Satchidananda Dehuri. Hard C-means Clustering Algorithm in Gene Expression Data // International Journal on Advanced Computer Theory and Engineering, ISSN-PRINT: 2319-…&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|{{REVISIONUSER}}}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(cK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(nK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(c(K+n))&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]] (1.1-1.4, 2.7, 2.4), [[Участник:Темербекова_Гульгайша|Гульгайша Темербекова]] (1.5-1.10, 3, 2.4)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
&lt;br /&gt;
1.&#039;&#039;&#039;Инициализация: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Случайным образом определяются C векторов - центров кластеров&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;
3. &#039;&#039;&#039;Расчет оценочной функции:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Переопределение кластерных центров&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма &amp;lt;ref&amp;gt;Arabinda Panda &amp;amp; Satchidananda Dehuri. Hard C-means Clustering Algorithm in Gene Expression Data // International Journal on Advanced Computer Theory and Engineering, ISSN-PRINT: 2319-2526. - 2013. - v. 2. - p. 35-39 [http://www.irdindia.in/journal_ijacte/pdf/vol2_iss1/8.pdf]&amp;lt;/ref&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество наборов в &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;c_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{1}, c^*_{2}, ... c^*_{c}, M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{c} \sum_{u_{i} \in C_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;u_{1},u_{2}, ... u_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; c_{1},c_{2},...,c_{c}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K)\\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; c^*_{j} = \frac{1}{|C_{j}|} \sum_{u_{i} \in C_{j}}^{} c_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;|C_{j}| &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром данного алгоритма является вычисление на каждой итерации алгоритма квадратов норм между кластерными центрами и векторами из входного набор согласно формуле &amp;lt;math&amp;gt;\|u_k-c_i\|^2&amp;lt;/math&amp;gt;. На каждой итерации алгоритма происходит &amp;lt;math&amp;gt;cK&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;&lt;br /&gt;
\|u_k-c_i\|^2&lt;br /&gt;
&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;J=\sum_{j = 1}^{c} \sum_{u_{i} \in C_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&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; c^*_{j} = \frac{1}{|C_{j}|} \sum_{u_{i} \in C_{j}}^{} u_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая &amp;lt;ref&amp;gt; Jyh-Shing Roger Jang, Chuen-Tsai Sun, Eiji Mizutani. Neuro-fuzzy and soft computing: a computational approach to learning and machine intelligence. Prentice-Hall, Inc. Simon &amp;amp; Schuster/A Viacom Company Upper Saddle River, NJ 07458. - 1997. - p. 424. [http://it-claim.ru/Persons/Neyskiy/Article2_Neiskiy.pdf]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c-1)&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt; Pawan Kumar, Mr. Pankaj Verma, Rakesh Sharma. Comparative analysis of Fuzzy C-mean and Hard C-mean algorithm // International Journal of information Technology and Knowledge Management. - July-December 2010. - v. 2 [http://csjournals.com/IJITKM/PDF%203-1/39.pdf]&amp;lt;/ref&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход в &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 1. &#039;&#039;&#039;&#039;&#039;in&#039;&#039;&#039;&#039;&#039; - входные данные, &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - вычисление расстояния до кластерных центров и значение &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; единое для каждой группы &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - нахождение минимального расстояния до кластерных центров, &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - запись единички в столбец матрицы, &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - расчёт объектной функции, &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; — пересчёт кластерных центров, &#039;&#039;&#039;&#039;&#039;out&#039;&#039;&#039;&#039;&#039; — вывод полученных данных.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для одной итерации алгоритма в параллельном варианте требуется &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; раз последовательно выполнить для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; операций нахождения расстояния от элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
* &amp;lt;math&amp;gt;C-1&amp;lt;/math&amp;gt; сравнений, для нахождения минимального расстояния.&lt;br /&gt;
* операция записи единички в столбец матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Основным ресурсом алгоритма является вычисление квадрата нормы для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt;. Расчёт значения объектной функции &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; сложно представить в параллельном варианте, поэтому вычисление объектной функции производится последовательно.Использование параллельной реализации алгоритма приведёт к понижению производительности при небольшой размерности системы и малом объеме выборки. При параллельном варианте необходима пересылка данных, что при малом объеме выборки и небольшой размерности займет больше времени, чем при последовательном варианте.&lt;br /&gt;
Как легко видеть из информационного графа, высота [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] составляет &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;, ширина ЯПФ составляет &amp;lt;math&amp;gt;O(cK)&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;
# &amp;lt;math&amp;gt;\{u_k\}_{k=1}^{K}&amp;lt;/math&amp;gt; — исходный набор векторов, принадлежащие пространству &amp;lt;math&amp;gt;\mathbb{R}^n&amp;lt;/math&amp;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; &amp;lt;math&amp;gt;nK&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;M&amp;lt;/math&amp;gt; — матрица, принадлежащая пространству &amp;lt;math&amp;gt;\mathbb{R}^{c \times K}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &amp;lt;math&amp;gt;\{c^*_i\}_{i=1}^{c}&amp;lt;/math&amp;gt; — набор построенных кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;c(K+n)&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;
&#039;&#039;&#039;Достоинства:&#039;&#039;&#039; легкость реализации,вычислительная простота.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039; задание количества кластеров,отсутствие гарантии в нахождении оптимального решения.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации алгоритма Hard C - Means (HCM). Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета] с пиковой производительностью 1,7 Пфлопс, число процессоров/ядер x86: 12 346 / 52 168. Программа написана на языке C с использованием [https://parallel.ru/cluster/lomonosov_howto MPI], не использовалось дополнительных опций. Использовалась следующая [https://github.com/cNikolaou/mpi-kmeans параллельная реализация алгоритма HCM].&lt;br /&gt;
Компилятор: gcc.&lt;br /&gt;
Версия MPI - intel openmpi/1.8.4-icc.&lt;br /&gt;
Модель используемого CPU - Intel Xeon X5570 2.93GHz.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число ядер &amp;lt;math&amp;gt;[16 : 256]&amp;lt;/math&amp;gt; с шагом по степеням двойки;&lt;br /&gt;
*	объём выборки &amp;lt;math&amp;gt;[10^3:10^7]&amp;lt;/math&amp;gt;  с шагом по степеням десятки;&lt;br /&gt;
&lt;br /&gt;
На рисунке приведена параллельная реализация алгоритма Hard C - Means (HCM). Изменение вычислительного времени алгоритма в зависимости от числа ядер и размера исходных данных. &lt;br /&gt;
&lt;br /&gt;
[[Файл:scheme1.png]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*  [https://github.com/artpar/Hard-Clustering-implementation Последовательная реализация на С++ ]&lt;br /&gt;
&lt;br /&gt;
*  [http://projects.jasmeet.me/2013/03/HardCMeans.html Последовательная реализация на MatLab ]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=21199</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=21199"/>
		<updated>2016-12-18T15:44:39Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Математическое описание алгоритма Arabinda Panda &amp;amp; Satchidananda Dehuri. Hard C-means Clustering Algorithm in Gene Expression Data // International Journal on Advanced Computer Theory and Engineering, ISSN-PRINT: 2319-…&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|{{REVISIONUSER}}}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(cK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(nK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(c(K+n))&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]] (1.1-1.4, 2.7, 2.4), [[Участник:Темербекова_Гульгайша|Гульгайша Темербекова]] (1.5-1.10, 3, 2.4)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
&lt;br /&gt;
1.&#039;&#039;&#039;Инициализация: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Случайным образом определяются C векторов - центров кластеров&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;
3. &#039;&#039;&#039;Расчет оценочной функции:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Переопределение кластерных центров&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма &amp;lt;ref&amp;gt;Arabinda Panda &amp;amp; Satchidananda Dehuri. Hard C-means Clustering Algorithm in Gene Expression Data // International Journal on Advanced Computer Theory and Engineering, ISSN-PRINT: 2319-2526. - 2013. - v. 2. - p. 35-39 [http://www.irdindia.in/journal_ijacte/pdf/vol2_iss1/8.pdf]&amp;lt;/ref&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U&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;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество наборов в &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;c_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{1}, c^*_{2}, ... c^*_{c}, M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{c} \sum_{u_{i} \in C_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;u_{1},u_{2}, ... u_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; c_{1},c_{2},...,c_{c}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K)\\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; c^*_{j} = \frac{1}{|C_{j}|} \sum_{u_{i} \in C_{j}}^{} c_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;|C_{j}| &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром данного алгоритма является вычисление на каждой итерации алгоритма квадратов норм между кластерными центрами и векторами из входного набор согласно формуле &amp;lt;math&amp;gt;\|u_k-c_i\|^2&amp;lt;/math&amp;gt;. На каждой итерации алгоритма происходит &amp;lt;math&amp;gt;cK&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;&lt;br /&gt;
\|u_k-c_i\|^2&lt;br /&gt;
&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;J=\sum_{j = 1}^{c} \sum_{u_{i} \in C_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&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; c^*_{j} = \frac{1}{|C_{j}|} \sum_{u_{i} \in C_{j}}^{} u_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая &amp;lt;ref&amp;gt; Jyh-Shing Roger Jang, Chuen-Tsai Sun, Eiji Mizutani. Neuro-fuzzy and soft computing: a computational approach to learning and machine intelligence. Prentice-Hall, Inc. Simon &amp;amp; Schuster/A Viacom Company Upper Saddle River, NJ 07458. - 1997. - p. 424. [http://it-claim.ru/Persons/Neyskiy/Article2_Neiskiy.pdf]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c-1)&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt; Pawan Kumar, Mr. Pankaj Verma, Rakesh Sharma. Comparative analysis of Fuzzy C-mean and Hard C-mean algorithm // International Journal of information Technology and Knowledge Management. - July-December 2010. - v. 2 [http://csjournals.com/IJITKM/PDF%203-1/39.pdf]&amp;lt;/ref&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход в &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 1. &#039;&#039;&#039;&#039;&#039;in&#039;&#039;&#039;&#039;&#039; - входные данные, &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - вычисление расстояния до кластерных центров и значение &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; единое для каждой группы &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - нахождение минимального расстояния до кластерных центров, &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - запись единички в столбец матрицы, &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - расчёт объектной функции, &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; — пересчёт кластерных центров, &#039;&#039;&#039;&#039;&#039;out&#039;&#039;&#039;&#039;&#039; — вывод полученных данных.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для одной итерации алгоритма в параллельном варианте требуется &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; раз последовательно выполнить для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; операций нахождения расстояния от элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
* &amp;lt;math&amp;gt;C-1&amp;lt;/math&amp;gt; сравнений, для нахождения минимального расстояния.&lt;br /&gt;
* операция записи единички в столбец матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Основным ресурсом алгоритма является вычисление квадрата нормы для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt;. Расчёт значения объектной функции &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; сложно представить в параллельном варианте, поэтому вычисление объектной функции производится последовательно.Использование параллельной реализации алгоритма приведёт к понижению производительности при небольшой размерности системы и малом объеме выборки. При параллельном варианте необходима пересылка данных, что при малом объеме выборки и небольшой размерности займет больше времени, чем при последовательном варианте.&lt;br /&gt;
Как легко видеть из информационного графа, высота [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] составляет &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;, ширина ЯПФ составляет &amp;lt;math&amp;gt;O(cK)&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;
# &amp;lt;math&amp;gt;\{u_k\}_{k=1}^{K}&amp;lt;/math&amp;gt; — исходный набор векторов, принадлежащие пространству &amp;lt;math&amp;gt;\mathbb{R}^n&amp;lt;/math&amp;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; &amp;lt;math&amp;gt;nK&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;M&amp;lt;/math&amp;gt; — матрица, принадлежащая пространству &amp;lt;math&amp;gt;\mathbb{R}^{c \times K}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &amp;lt;math&amp;gt;\{c^*_i\}_{i=1}^{c}&amp;lt;/math&amp;gt; — набор построенных кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;c(K+n)&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;
&#039;&#039;&#039;Достоинства:&#039;&#039;&#039; легкость реализации,вычислительная простота.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039; задание количества кластеров,отсутствие гарантии в нахождении оптимального решения.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации алгоритма Hard C - Means (HCM). Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета] с пиковой производительностью 1,7 Пфлопс, число процессоров/ядер x86: 12 346 / 52 168. Программа написана на языке C с использованием [https://parallel.ru/cluster/lomonosov_howto MPI], не использовалось дополнительных опций. Использовалась следующая [https://github.com/cNikolaou/mpi-kmeans параллельная реализация алгоритма HCM].&lt;br /&gt;
Компилятор: gcc.&lt;br /&gt;
Версия MPI - intel openmpi/1.8.4-icc.&lt;br /&gt;
Модель используемого CPU - Intel Xeon X5570 2.93GHz.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число ядер &amp;lt;math&amp;gt;[16 : 256]&amp;lt;/math&amp;gt; с шагом по степеням двойки;&lt;br /&gt;
*	объём выборки &amp;lt;math&amp;gt;[10^3:10^7]&amp;lt;/math&amp;gt;  с шагом по степеням десятки;&lt;br /&gt;
&lt;br /&gt;
На рисунке приведена параллельная реализация алгоритма Hard C - Means (HCM). Изменение вычислительного времени алгоритма в зависимости от числа ядер и размера исходных данных. &lt;br /&gt;
&lt;br /&gt;
[[Файл:scheme1.png]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*  [https://github.com/artpar/Hard-Clustering-implementation Последовательная реализация на С++ ]&lt;br /&gt;
&lt;br /&gt;
*  [http://projects.jasmeet.me/2013/03/HardCMeans.html Последовательная реализация на MatLab ]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=20636</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=20636"/>
		<updated>2016-12-11T16:07:01Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(cK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(nK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(c(K+n))&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]] (1.1-1.4, 2.7), [[Участник:Темербекова_Гульгайша|Гульгайша Темербекова]] (1.5-1.10, 3)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
&lt;br /&gt;
1.&#039;&#039;&#039;Инициализация: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Случайным образом определяются C векторов - центров кластеров&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;
3. &#039;&#039;&#039;Расчет оценочной функции:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Переопределение кластерных центров&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма &amp;lt;ref&amp;gt;Arabinda Panda &amp;amp; Satchidananda Dehuri. Hard C-means Clustering Algorithm in Gene Expression Data // International Journal on Advanced Computer Theory and Engineering, ISSN-PRINT: 2319-2526. - 2013. - v. 2. - p. 35-39 [http://www.irdindia.in/journal_ijacte/pdf/vol2_iss1/8.pdf]&amp;lt;/ref&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество наборов в &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;c_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{1}, c^*_{2}, ... c^*_{c}, M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{c} \sum_{u_{i} \in C_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;u_{1},u_{2}, ... u_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; c_{1},c_{2},...,c_{c}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K)\\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; c^*_{j} = \frac{1}{|C_{j}|} \sum_{u_{i} \in C_{j}}^{} c_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;|C_{j}| &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром данного алгоритма является вычисление на каждой итерации алгоритма квадратов норм между кластерными центрами и векторами из входного набор согласно формуле &amp;lt;math&amp;gt;\|u_k-c_i\|^2&amp;lt;/math&amp;gt;. На каждой итерации алгоритма происходит &amp;lt;math&amp;gt;cK&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;&lt;br /&gt;
\|u_k-c_i\|^2&lt;br /&gt;
&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;J=\sum_{j = 1}^{c} \sum_{u_{i} \in C_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&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; c^*_{j} = \frac{1}{|C_{j}|} \sum_{u_{i} \in C_{j}}^{} u_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая &amp;lt;ref&amp;gt; Jyh-Shing Roger Jang, Chuen-Tsai Sun, Eiji Mizutani. Neuro-fuzzy and soft computing: a computational approach to learning and machine intelligence. Prentice-Hall, Inc. Simon &amp;amp; Schuster/A Viacom Company Upper Saddle River, NJ 07458. - 1997. - p. 424. [http://it-claim.ru/Persons/Neyskiy/Article2_Neiskiy.pdf]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c-1)&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt; Pawan Kumar, Mr. Pankaj Verma, Rakesh Sharma. Comparative analysis of Fuzzy C-mean and Hard C-mean algorithm // International Journal of information Technology and Knowledge Management. - July-December 2010. - v. 2 [http://csjournals.com/IJITKM/PDF%203-1/39.pdf]&amp;lt;/ref&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход в &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 1. &#039;&#039;&#039;&#039;&#039;in&#039;&#039;&#039;&#039;&#039; - входные данные, &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - вычисление расстояния до кластерных центров и значение &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; единое для каждой группы &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - нахождение минимального расстояния до кластерных центров, &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - запись единички в столбец матрицы, &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - расчёт объектной функции, &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; — пересчёт кластерных центров, &#039;&#039;&#039;&#039;&#039;out&#039;&#039;&#039;&#039;&#039; — вывод полученных данных.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для одной итерации алгоритма в параллельном варианте требуется &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; раз последовательно выполнить для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; операций нахождения расстояния от элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
* &amp;lt;math&amp;gt;C-1&amp;lt;/math&amp;gt; сравнений, для нахождения минимального расстояния.&lt;br /&gt;
* операция записи единички в столбец матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Основным ресурсом алгоритма является вычисление квадрата нормы для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt;. Расчёт значения объектной функции &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; сложно представить в параллельном варианте, поэтому вычисление объектной функции производится последовательно.Использование параллельной реализации алгоритма приведёт к понижению производительности при небольшой размерности системы и малом объеме выборки. При параллельном варианте необходима пересылка данных, что при малом объеме выборки и небольшой размерности займет больше времени, чем при последовательном варианте.&lt;br /&gt;
Как легко видеть из информационного графа, высота [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] составляет &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;, ширина ЯПФ составляет &amp;lt;math&amp;gt;O(cK)&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;
# &amp;lt;math&amp;gt;\{u_k\}_{k=1}^{K}&amp;lt;/math&amp;gt; — исходный набор векторов, принадлежащие пространству &amp;lt;math&amp;gt;\mathbb{R}^n&amp;lt;/math&amp;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; &amp;lt;math&amp;gt;nK&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;M&amp;lt;/math&amp;gt; — матрица, принадлежащая пространству &amp;lt;math&amp;gt;\mathbb{R}^{c \times K}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &amp;lt;math&amp;gt;\{c^*_i\}_{i=1}^{c}&amp;lt;/math&amp;gt; — набор построенных кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;c(K+n)&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;
&#039;&#039;&#039;Достоинства:&#039;&#039;&#039; легкость реализации,вычислительная простота.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039; задание количества кластеров,отсутствие гарантии в нахождении оптимального решения.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
[[Файл:scheme1.png]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*  [https://github.com/artpar/Hard-Clustering-implementation Последовательная реализация на С++ ]&lt;br /&gt;
&lt;br /&gt;
*  [http://projects.jasmeet.me/2013/03/HardCMeans.html Последовательная реализация на MatLab ]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13080</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13080"/>
		<updated>2016-10-17T22:35:22Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(cK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(nK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(c(K+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;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
&lt;br /&gt;
1.&#039;&#039;&#039;Инициализация: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Случайным образом определяются C векторов - центров кластеров&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;
3. &#039;&#039;&#039;Расчет оценочной функции:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Переопределение кластерных центров&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма &amp;lt;ref&amp;gt;Arabinda Panda &amp;amp; Satchidananda Dehuri, Hard C-means Clustering Algorithm in Gene Expression Data [http://www.irdindia.in/journal_ijacte/pdf/vol2_iss1/8.pdf]&amp;lt;/ref&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество наборов в &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;c_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{1}, c^*_{2}, ... c^*_{c}, M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{c} \sum_{u_{i} \in C_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;u_{1},u_{2}, ... u_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; c_{1},c_{2},...,c_{c}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K)\\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; c^*_{j} = \frac{1}{|C_{j}|} \sum_{u_{i} \in C_{j}}^{} c_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;|C_{j}| &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром данного алгоритма является вычисление на каждой итерации алгоритма квадратов норм между кластерными центрами и векторами из входного набор согласно формуле &amp;lt;math&amp;gt;\|u_k-c_i\|^2&amp;lt;/math&amp;gt;. На каждой итерации алгоритма происходит &amp;lt;math&amp;gt;CN&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;&lt;br /&gt;
\|u_k-c_i\|^2&lt;br /&gt;
&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;J=\sum_{j = 1}^{c} \sum_{u_{i} \in C_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&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; c^*_{j} = \frac{1}{|C_{j}|} \sum_{u_{i} \in C_{j}}^{} u_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&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;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c-1)&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt; Pawan Kumar, Mr. Pankaj Verma, Rakesh Shrma. Comparative analysis of Fuzzy C-mean and Hard C-mean algorithm [http://csjournals.com/IJITKM/PDF%203-1/39.pdf]&amp;lt;/ref&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход в &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 1. &#039;&#039;&#039;&#039;&#039;in&#039;&#039;&#039;&#039;&#039; - входные данные, &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - вычисление расстояния до кластерных центров и значение &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; единое для каждой группы &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - нахождение минимального расстояния до кластерных центров, &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - запись единички в столбец матрицы, &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - расчёт объектной функции, &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; — пересчёт кластерных центров, &#039;&#039;&#039;&#039;&#039;out&#039;&#039;&#039;&#039;&#039; — вывод полученных данных.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для одной итерации алгоритма в параллельном варианте требуется &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; раз последовательно выполнить для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; операций нахождения расстояния от элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
* &amp;lt;math&amp;gt;C-1&amp;lt;/math&amp;gt; сравнений, для нахождения минимального расстояния.&lt;br /&gt;
* операция записи единички в столбец матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Основным ресурсом алгоритма является вычисление квадрата нормы для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt;. Расчёт значения объектной функции &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; сложно представить в параллельном варианте, поэтому вычисление объектной функции производится последовательно.Использование параллельной реализации алгоритма приведёт к понижению производительности при небольшой размерности системы и малом объеме выборки. При параллельном варианте необходима пересылка данных, что при малом объеме выборки и небольшой размерности займет больше времени, чем при последовательном варианте.&lt;br /&gt;
Как легко видеть из информационного графа, высота [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] составляет &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;, ширина ЯПФ составляет &amp;lt;math&amp;gt;O(cK)&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;
# &amp;lt;math&amp;gt;\{u_k\}_{k=1}^{K}&amp;lt;/math&amp;gt; — исходный набор векторов, принадлежащие пространству &amp;lt;math&amp;gt;\mathbb{R}^n&amp;lt;/math&amp;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; &amp;lt;math&amp;gt;nK&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;M&amp;lt;/math&amp;gt; — матрица, принадлежащая пространству &amp;lt;math&amp;gt;\mathbb{R}^{c \times K}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &amp;lt;math&amp;gt;\{c^*_i\}_{i=1}^{c}&amp;lt;/math&amp;gt; — набор построенных кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;c(K+n)&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;
&#039;&#039;&#039;Достоинства:&#039;&#039;&#039; легкость реализации,вычислительная простота.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039; задание количества кластеров,отсутствие гарантии в нахождении оптимального решения.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*  [https://github.com/artpar/Hard-Clustering-implementation Последовательная реализация на С++ ]&lt;br /&gt;
&lt;br /&gt;
*  [http://projects.jasmeet.me/2013/03/HardCMeans.html Последовательная реализация на MatLab ]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13079</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13079"/>
		<updated>2016-10-17T22:33:23Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(cK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(nK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(c(K+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;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
&lt;br /&gt;
1.&#039;&#039;&#039;Инициализация: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Случайным образом определяются C векторов - центров кластеров&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;
3. &#039;&#039;&#039;Расчет оценочной функции:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Переопределение кластерных центров&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма &amp;lt;ref&amp;gt;Arabinda Panda &amp;amp; Satchidananda Dehuri, Hard C-means Clustering Algorithm in Gene Expression Data [http://www.irdindia.in/journal_ijacte/pdf/vol2_iss1/8.pdf]&amp;lt;/ref&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество наборов в &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;c_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{1}, c^*_{2}, ... c^*_{c}, M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{c} \sum_{u_{i} \in C_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;u_{1},u_{2}, ... u_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; c_{1},c_{2},...,c_{c}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K)\\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; c^*_{j} = \frac{1}{|C_{j}|} \sum_{u_{i} \in C_{j}}^{} c_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;|C_{j}| &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром данного алгоритма является вычисление на каждой итерации алгоритма квадратов норм между кластерными центрами и векторами из входного набор согласно формуле &amp;lt;math&amp;gt;\|u_k-c_i\|^2&amp;lt;/math&amp;gt;. На каждой итерации алгоритма происходит &amp;lt;math&amp;gt;CN&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;&lt;br /&gt;
\|u_k-c_i\|^2&lt;br /&gt;
&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;J=\sum_{j = 1}^{c} \sum_{u_{i} \in C_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&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; c^*_{j} = \frac{1}{|C_{j}|} \sum_{u_{i} \in C_{j}}^{} u_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&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;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c-1)&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt; Pawan Kumar, Mr. Pankaj Verma, Rakesh Shrma. Comparative analysis of Fuzzy C-mean and Hard C-mean algorithm [http://csjournals.com/IJITKM/PDF%203-1/39.pdf]&amp;lt;/ref&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход в &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 1. &#039;&#039;&#039;&#039;&#039;in&#039;&#039;&#039;&#039;&#039; - входные данные, &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - вычисление расстояния до кластерных центров и значение &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; единое для каждой группы &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - нахождение минимального расстояния до кластерных центров, &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - запись единички в столбец матрицы, &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - расчёт объектной функции, &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; — пересчёт кластерных центров, &#039;&#039;&#039;&#039;&#039;out&#039;&#039;&#039;&#039;&#039; — вывод полученных данных.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для одной итерации алгоритма в параллельном варианте требуется &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; раз последовательно выполнить для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; операций нахождения расстояния от элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
* &amp;lt;math&amp;gt;C-1&amp;lt;/math&amp;gt; сравнений, для нахождения минимального расстояния.&lt;br /&gt;
* операция записи единички в столбец матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Основным ресурсом алгоритма является вычисление квадрата нормы для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt;. Расчёт значения объектной функции &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; сложно представить в параллельном варианте, поэтому вычисление объектной функции производится последовательно.Использование параллельной реализации алгоритма приведёт к понижению производительности при небольшой размерности системы и малом объеме выборки. При параллельном варианте необходима пересылка данных, что при малом объеме выборки и небольшой размерности займет больше времени, чем при последовательном варианте.&lt;br /&gt;
Как легко видеть из информационного графа, высота [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] составляет &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;, ширина ЯПФ составляет &amp;lt;math&amp;gt;O(cK)&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;
# &amp;lt;math&amp;gt;\{u_k\}_{k=1}^{K}&amp;lt;/math&amp;gt; — исходный набор векторов, принадлежащие пространству &amp;lt;math&amp;gt;\mathbb{R}^n&amp;lt;/math&amp;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; &amp;lt;math&amp;gt;nK&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;M&amp;lt;/math&amp;gt; — матрица, принадлежащая пространству &amp;lt;math&amp;gt;\mathbb{R}^{c \times K}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &amp;lt;math&amp;gt;\{c^*_i\}_{i=1}^{c}&amp;lt;/math&amp;gt; — набор построенных кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;c(K+n)&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;
&#039;&#039;&#039;Достоинства:&#039;&#039;&#039; легкость реализации,вычислительная простота.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039; задание количества кластеров,отсутствие гарантии в нахождении оптимального решения.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*  [https://github.com/artpar/Hard-Clustering-implementation Последовательная реализация на С++ ]&lt;br /&gt;
&lt;br /&gt;
*  [http://projects.jasmeet.me/2013/03/HardCMeans.html Последовательная реализация на MatLab ]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13075</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13075"/>
		<updated>2016-10-17T22:30:18Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(cK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(nK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(c(K+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;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
&lt;br /&gt;
1.&#039;&#039;&#039;Инициализация: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Случайным образом определяются C векторов - центров кластеров&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;
3. &#039;&#039;&#039;Расчет оценочной функции:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Переопределение кластерных центров&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество наборов в &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;c_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{1}, c^*_{2}, ... c^*_{c}, M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{c} \sum_{u_{i} \in C_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;u_{1},u_{2}, ... u_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; c_{1},c_{2},...,c_{c}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K)\\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; c^*_{j} = \frac{1}{|C_{j}|} \sum_{u_{i} \in C_{j}}^{} c_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;|C_{j}| &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром данного алгоритма является вычисление на каждой итерации алгоритма квадратов норм между кластерными центрами и векторами из входного набор согласно формуле &amp;lt;math&amp;gt;\|u_k-c_i\|^2&amp;lt;/math&amp;gt;. На каждой итерации алгоритма происходит &amp;lt;math&amp;gt;CN&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;&lt;br /&gt;
\|u_k-c_i\|^2&lt;br /&gt;
&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;J=\sum_{j = 1}^{c} \sum_{u_{i} \in C_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&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; c^*_{j} = \frac{1}{|C_{j}|} \sum_{u_{i} \in C_{j}}^{} u_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&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;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c-1)&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt; Pawan Kumar, Mr. Pankaj Verma, Rakesh Shrma. Comparative analysis of Fuzzy C-mean and Hard C-mean algorithm [http://csjournals.com/IJITKM/PDF%203-1/39.pdf]&amp;lt;/ref&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход в &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 1. &#039;&#039;&#039;&#039;&#039;in&#039;&#039;&#039;&#039;&#039; - входные данные, &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - вычисление расстояния до кластерных центров и значение &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; единое для каждой группы &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - нахождение минимального расстояния до кластерных центров, &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - запись единички в столбец матрицы, &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - расчёт объектной функции, &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; — пересчёт кластерных центров, &#039;&#039;&#039;&#039;&#039;out&#039;&#039;&#039;&#039;&#039; — вывод полученных данных.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для одной итерации алгоритма в параллельном варианте требуется &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; раз последовательно выполнить для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; операций нахождения расстояния от элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
* &amp;lt;math&amp;gt;C-1&amp;lt;/math&amp;gt; сравнений, для нахождения минимального расстояния.&lt;br /&gt;
* операция записи единички в столбец матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Основным ресурсом алгоритма является вычисление квадрата нормы для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt;. Расчёт значения объектной функции &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; сложно представить в параллельном варианте, поэтому вычисление объектной функции производится последовательно.Использование параллельной реализации алгоритма приведёт к понижению производительности при небольшой размерности системы и малом объеме выборки. При параллельном варианте необходима пересылка данных, что при малом объеме выборки и небольшой размерности займет больше времени, чем при последовательном варианте.&lt;br /&gt;
Как легко видеть из информационного графа, высота [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] составляет &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;, ширина ЯПФ составляет &amp;lt;math&amp;gt;O(cK)&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;
# &amp;lt;math&amp;gt;\{u_k\}_{k=1}^{K}&amp;lt;/math&amp;gt; — исходный набор векторов, принадлежащие пространству &amp;lt;math&amp;gt;\mathbb{R}^n&amp;lt;/math&amp;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; &amp;lt;math&amp;gt;nK&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;M&amp;lt;/math&amp;gt; — матрица, принадлежащая пространству &amp;lt;math&amp;gt;\mathbb{R}^{c \times K}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &amp;lt;math&amp;gt;\{c^*_i\}_{i=1}^{c}&amp;lt;/math&amp;gt; — набор построенных кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;c(K+n)&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;
&#039;&#039;&#039;Достоинства:&#039;&#039;&#039; легкость реализации,вычислительная простота.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039; задание количества кластеров,отсутствие гарантии в нахождении оптимального решения.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*  [https://github.com/artpar/Hard-Clustering-implementation Последовательная реализация на С++ ]&lt;br /&gt;
&lt;br /&gt;
*  [http://projects.jasmeet.me/2013/03/HardCMeans.html Последовательная реализация на MatLab ]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13074</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13074"/>
		<updated>2016-10-17T22:30:07Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(cK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(nK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(c(K+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;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
&lt;br /&gt;
1.&#039;&#039;&#039;Инициализация: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Случайным образом определяются C векторов - центров кластеров&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;
3. &#039;&#039;&#039;Расчет оценочной функции:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Переопределение кластерных центров&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество наборов в &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;c_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{1}, c^*_{2}, ... c^*_{c}, M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{c} \sum_{u_{i} \in C_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;u_{1},u_{2}, ... u_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; c_{1},c_{2},...,c_{c}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K)\\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; c^*_{j} = \frac{1}{|C_{j}|} \sum_{u_{i} \in C_{j}}^{} c_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;|C_{j}| &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром данного алгоритма является вычисление на каждой итерации алгоритма квадратов норм между кластерными центрами и векторами из входного набор согласно формуле &amp;lt;math&amp;gt;\|u_k-c_i\|^2&amp;lt;/math&amp;gt;. На каждой итерации алгоритма происходит &amp;lt;math&amp;gt;CN&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;&lt;br /&gt;
\|u_k-c_i\|^2&lt;br /&gt;
&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;J=\sum_{j = 1}^{c} \sum_{u_{i} \in C_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&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; c^*_{j} = \frac{1}{|C_{j}|} \sum_{u_{i} \in C_{j}}^{} u_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&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;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c-1)&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt; Pawan Kumar, Mr. Pankaj Verma, Rakesh Shrma. Comparative analysis of Fuzzy C-mean and Hard C-mean algorithm [http://csjournals.com/IJITKM/PDF%203-1/39.pdf]&amp;lt;/ref&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход в &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 1. &#039;&#039;&#039;&#039;&#039;in&#039;&#039;&#039;&#039;&#039; - входные данные, &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - вычисление расстояния до кластерных центров и значение &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; единое для каждой группы &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - нахождение минимального расстояния до кластерных центров, &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - запись единички в столбец матрицы, &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - расчёт объектной функции, &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; — пересчёт кластерных центров, &#039;&#039;&#039;&#039;&#039;out&#039;&#039;&#039;&#039;&#039; — вывод полученных данных.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для одной итерации алгоритма в параллельном варианте требуется &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; раз последовательно выполнить для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; операций нахождения расстояния от элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
* &amp;lt;math&amp;gt;C-1&amp;lt;/math&amp;gt; сравнений, для нахождения минимального расстояния.&lt;br /&gt;
* операция записи единички в столбец матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Основным ресурсом алгоритма является вычисление квадрата нормы для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt;. Расчёт значения объектной функции &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; сложно представить в параллельном варианте, поэтому вычисление объектной функции производится последовательно.Использование параллельной реализации алгоритма приведёт к понижению производительности при небольшой размерности системы и малом объеме выборки. При параллельном варианте необходима пересылка данных, что при малом объеме выборки и небольшой размерности займет больше времени, чем при последовательном варианте.&lt;br /&gt;
Как легко видеть из информационного графа, высота [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] составляет &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;, ширина ЯПФ составляет &amp;lt;math&amp;gt;O(cK)&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;
# &amp;lt;math&amp;gt;\{u_k\}_{k=1}^{K}&amp;lt;/math&amp;gt; — исходный набор векторов, принадлежащие пространству &amp;lt;math&amp;gt;\mathbb{R}^n&amp;lt;/math&amp;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; &amp;lt;math&amp;gt;nK&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;M&amp;lt;/math&amp;gt; — матрица, принадлежащая пространству &amp;lt;math&amp;gt;\mathbb{R}^{c \times K}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &amp;lt;math&amp;gt;\{c^*_i\}_{i=1}^{c}&amp;lt;/math&amp;gt; — набор построенных кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;c(K+n)&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;
&#039;&#039;&#039;Достоинства:&#039;&#039;&#039; легкость реализации,вычислительная простота.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039; задание количества кластеров,отсутствие гарантии в нахождении оптимального решения.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*  [https://github.com/artpar/Hard-Clustering-implementation Последовательная реализация на С++ ]&lt;br /&gt;
&lt;br /&gt;
* [http://projects.jasmeet.me/2013/03/HardCMeans.html Последовательная реализация на MatLab ]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13073</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13073"/>
		<updated>2016-10-17T22:28:02Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(cK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(nK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(c(K+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;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
&lt;br /&gt;
1.&#039;&#039;&#039;Инициализация: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Случайным образом определяются C векторов - центров кластеров&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;
3. &#039;&#039;&#039;Расчет оценочной функции:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Переопределение кластерных центров&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество наборов в &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;c_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{1}, c^*_{2}, ... c^*_{c}, M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{c} \sum_{u_{i} \in C_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;u_{1},u_{2}, ... u_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; c_{1},c_{2},...,c_{c}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K)\\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; c^*_{j} = \frac{1}{|C_{j}|} \sum_{u_{i} \in C_{j}}^{} c_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;|C_{j}| &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром данного алгоритма является вычисление на каждой итерации алгоритма квадратов норм между кластерными центрами и векторами из входного набор согласно формуле &amp;lt;math&amp;gt;\|u_k-c_i\|^2&amp;lt;/math&amp;gt;. На каждой итерации алгоритма происходит &amp;lt;math&amp;gt;CN&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;&lt;br /&gt;
\|u_k-c_i\|^2&lt;br /&gt;
&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;J=\sum_{j = 1}^{c} \sum_{u_{i} \in C_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&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; c^*_{j} = \frac{1}{|C_{j}|} \sum_{u_{i} \in C_{j}}^{} u_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&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;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c-1)&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt; Pawan Kumar, Mr. Pankaj Verma, Rakesh Shrma. Comparative analysis of Fuzzy C-mean and Hard C-mean algorithm [http://csjournals.com/IJITKM/PDF%203-1/39.pdf]&amp;lt;/ref&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход в &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 1. &#039;&#039;&#039;&#039;&#039;in&#039;&#039;&#039;&#039;&#039; - входные данные, &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - вычисление расстояния до кластерных центров и значение &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; единое для каждой группы &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - нахождение минимального расстояния до кластерных центров, &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - запись единички в столбец матрицы, &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - расчёт объектной функции, &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; — пересчёт кластерных центров, &#039;&#039;&#039;&#039;&#039;out&#039;&#039;&#039;&#039;&#039; — вывод полученных данных.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для одной итерации алгоритма в параллельном варианте требуется &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; раз последовательно выполнить для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; операций нахождения расстояния от элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
* &amp;lt;math&amp;gt;C-1&amp;lt;/math&amp;gt; сравнений, для нахождения минимального расстояния.&lt;br /&gt;
* операция записи единички в столбец матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Основным ресурсом алгоритма является вычисление квадрата нормы для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt;. Расчёт значения объектной функции &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; сложно представить в параллельном варианте, поэтому вычисление объектной функции производится последовательно.Использование параллельной реализации алгоритма приведёт к понижению производительности при небольшой размерности системы и малом объеме выборки. При параллельном варианте необходима пересылка данных, что при малом объеме выборки и небольшой размерности займет больше времени, чем при последовательном варианте.&lt;br /&gt;
Как легко видеть из информационного графа, высота [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] составляет &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;, ширина ЯПФ составляет &amp;lt;math&amp;gt;O(cK)&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;
# &amp;lt;math&amp;gt;\{u_k\}_{k=1}^{K}&amp;lt;/math&amp;gt; — исходный набор векторов, принадлежащие пространству &amp;lt;math&amp;gt;\mathbb{R}^n&amp;lt;/math&amp;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; &amp;lt;math&amp;gt;nK&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;M&amp;lt;/math&amp;gt; — матрица, принадлежащая пространству &amp;lt;math&amp;gt;\mathbb{R}^{c \times K}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &amp;lt;math&amp;gt;\{c^*_i\}_{i=1}^{c}&amp;lt;/math&amp;gt; — набор построенных кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;c(K+n)&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;
&#039;&#039;&#039;Достоинства:&#039;&#039;&#039; легкость реализации,вычислительная простота.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039; задание количества кластеров,отсутствие гарантии в нахождении оптимального решения.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13071</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13071"/>
		<updated>2016-10-17T22:27:05Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(cK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(nK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(c(K+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;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
&lt;br /&gt;
1.&#039;&#039;&#039;Инициализация: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Случайным образом определяются C векторов - центров кластеров&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;
3. &#039;&#039;&#039;Расчет оценочной функции:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Переопределение кластерных центров&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество наборов в &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;c_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{1}, c^*_{2}, ... c^*_{c}, M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{c} \sum_{u_{i} \in C_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;u_{1},u_{2}, ... u_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; c_{1},c_{2},...,c_{c}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K)\\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; c^*_{j} = \frac{1}{|C_{j}|} \sum_{u_{i} \in C_{j}}^{} c_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;|C_{j}| &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром данного алгоритма является вычисление на каждой итерации алгоритма квадратов норм между кластерными центрами и векторами из входного набор согласно формуле &amp;lt;math&amp;gt;\|u_k-c_i\|^2&amp;lt;/math&amp;gt;. На каждой итерации алгоритма происходит &amp;lt;math&amp;gt;CN&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;&lt;br /&gt;
\|u_k-c_i\|^2&lt;br /&gt;
&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;J=\sum_{j = 1}^{c} \sum_{u_{i} \in C_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&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; c^*_{j} = \frac{1}{|C_{j}|} \sum_{u_{i} \in C_{j}}^{} u_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&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;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c-1)&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt; Pawan Kumar, Mr. Pankaj Verma, Rakesh Shrma. Comparative analysis of Fuzzy C-mean and Hard C-mean algorithm [http://csjournals.com/IJITKM/PDF%203-1/39.pdf]&amp;lt;/ref&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход в &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 1. &#039;&#039;&#039;&#039;&#039;in&#039;&#039;&#039;&#039;&#039; - входные данные, &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - вычисление расстояния до кластерных центров и значение &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; единое для каждой группы &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - нахождение минимального расстояния до кластерных центров, &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - запись единички в столбец матрицы, &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - расчёт объектной функции, &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; — пересчёт кластерных центров, &#039;&#039;&#039;&#039;&#039;out&#039;&#039;&#039;&#039;&#039; — вывод полученных данных.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для одной итерации алгоритма в параллельном варианте требуется &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; раз последовательно выполнить для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; операций нахождения расстояния от элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
* &amp;lt;math&amp;gt;C-1&amp;lt;/math&amp;gt; сравнений, для нахождения минимального расстояния.&lt;br /&gt;
* операция записи единички в столбец матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Основным ресурсом алгоритма является вычисление квадрата нормы для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt;. Расчёт значения объектной функции &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; сложно представить в параллельном варианте, поэтому вычисление объектной функции производится последовательно.Использование параллельной реализации алгоритма приведёт к понижению производительности при небольшой размерности системы и малом объеме выборки. При параллельном варианте необходима пересылка данных, что при малом объеме выборки и небольшой размерности займет больше времени, чем при последовательном варианте.&lt;br /&gt;
Как легко видеть из информационного графа, высота [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] составляет &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;, ширина ЯПФ составляет &amp;lt;math&amp;gt;O(cK)&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;
# &amp;lt;math&amp;gt;\{u_k\}_{k=1}^{K}&amp;lt;/math&amp;gt; — исходный набор векторов, принадлежащие пространству &amp;lt;math&amp;gt;\mathbb{R}^n&amp;lt;/math&amp;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; &amp;lt;math&amp;gt;nK&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;M&amp;lt;/math&amp;gt; — матрица, принадлежащая пространству &amp;lt;math&amp;gt;\mathbb{R}^{c \times K}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &amp;lt;math&amp;gt;\{c_i\}_{i=1}^{c}&amp;lt;/math&amp;gt; — набор построенных кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;c(K+n)&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;
&#039;&#039;&#039;Достоинства:&#039;&#039;&#039; легкость реализации,вычислительная простота.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039; задание количества кластеров,отсутствие гарантии в нахождении оптимального решения.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13070</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13070"/>
		<updated>2016-10-17T22:26:22Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(cK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(nK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(c(K+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;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
&lt;br /&gt;
1.&#039;&#039;&#039;Инициализация: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Случайным образом определяются C векторов - центров кластеров&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;
3. &#039;&#039;&#039;Расчет оценочной функции:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Переопределение кластерных центров&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество наборов в &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;c_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{1}, c^*_{2}, ... c^*_{c}, M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{c} \sum_{u_{i} \in C_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;u_{1},u_{2}, ... u_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; c_{1},c_{2},...,c_{c}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K)\\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; c^*_{j} = \frac{1}{|C_{j}|} \sum_{u_{i} \in C_{j}}^{} c_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;|C_{j}| &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру &amp;lt;math&amp;gt;c_{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром данного алгоритма является вычисление на каждой итерации алгоритма квадратов норм между кластерными центрами и векторами из входного набор согласно формуле &amp;lt;math&amp;gt;\|u_k-c_i\|^2&amp;lt;/math&amp;gt;. На каждой итерации алгоритма происходит &amp;lt;math&amp;gt;CN&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;&lt;br /&gt;
\|u_k-c_i\|^2&lt;br /&gt;
&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;J=\sum_{j = 1}^{c} \sum_{u_{i} \in C_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&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; c^*_{j} = \frac{1}{|C_{j}|} \sum_{u_{i} \in C_{j}}^{} u_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&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;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c-1)&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt; Pawan Kumar, Mr. Pankaj Verma, Rakesh Shrma. Comparative analysis of Fuzzy C-mean and Hard C-mean algorithm [http://csjournals.com/IJITKM/PDF%203-1/39.pdf]&amp;lt;/ref&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход в &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 1. &#039;&#039;&#039;&#039;&#039;in&#039;&#039;&#039;&#039;&#039; - входные данные, &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - вычисление расстояния до кластерных центров и значение &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; единое для каждой группы &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - нахождение минимального расстояния до кластерных центров, &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - запись единички в столбец матрицы, &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - расчёт объектной функции, &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; — пересчёт кластерных центров, &#039;&#039;&#039;&#039;&#039;out&#039;&#039;&#039;&#039;&#039; — вывод полученных данных.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для одной итерации алгоритма в параллельном варианте требуется &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; раз последовательно выполнить для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; операций нахождения расстояния от элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
* &amp;lt;math&amp;gt;C-1&amp;lt;/math&amp;gt; сравнений, для нахождения минимального расстояния.&lt;br /&gt;
* операция записи единички в столбец матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Основным ресурсом алгоритма является вычисление квадрата нормы для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt;. Расчёт значения объектной функции &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; сложно представить в параллельном варианте, поэтому вычисление объектной функции производится последовательно.Использование параллельной реализации алгоритма приведёт к понижению производительности при небольшой размерности системы и малом объеме выборки. При параллельном варианте необходима пересылка данных, что при малом объеме выборки и небольшой размерности займет больше времени, чем при последовательном варианте.&lt;br /&gt;
Как легко видеть из информационного графа, высота [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] составляет &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;, ширина ЯПФ составляет &amp;lt;math&amp;gt;O(cK)&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;
# &amp;lt;math&amp;gt;\{u_k\}_{k=1}^{K}&amp;lt;/math&amp;gt; — исходный набор векторов, принадлежащие пространству &amp;lt;math&amp;gt;\mathbb{R}^n&amp;lt;/math&amp;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; &amp;lt;math&amp;gt;nK&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;M&amp;lt;/math&amp;gt; — матрица, принадлежащая пространству &amp;lt;math&amp;gt;\mathbb{R}^{c \times K}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &amp;lt;math&amp;gt;\{c_i\}_{i=1}^{c}&amp;lt;/math&amp;gt; — набор построенных кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;c(K+n)&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;
&#039;&#039;&#039;Достоинства:&#039;&#039;&#039; легкость реализации,вычислительная простота.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039; задание количества кластеров,отсутствие гарантии в нахождении оптимального решения.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13069</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13069"/>
		<updated>2016-10-17T22:25:58Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(cK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(nK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(c(K+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;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
&lt;br /&gt;
1.&#039;&#039;&#039;Инициализация: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Случайным образом определяются C векторов - центров кластеров&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;
3. &#039;&#039;&#039;Расчет оценочной функции:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Переопределение кластерных центров&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество наборов в &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;c_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{1}, c^*_{2}, ... c^*_{c}, M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{c} \sum_{u_{i} \in C_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;u_{1},u_{2}, ... u_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; c_{1},c_{2},...,c_{c}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K)\\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; c^*_{j} = \frac{1}{|C_{j}|} \sum_{u_{i} \in C_{j}}^{} c_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;|C_{j}| &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру &amp;lt;math&amp;gt;c_{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром данного алгоритма является вычисление на каждой итерации алгоритма квадратов норм между кластерными центрами и векторами из входного набор согласно формуле &amp;lt;math&amp;gt;\|u_k-c_i\|^2&amp;lt;/math&amp;gt;. На каждой итерации алгоритма происходит &amp;lt;math&amp;gt;CN&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;&lt;br /&gt;
\|u_k-c_i\|^2&lt;br /&gt;
&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;J=\sum_{j = 1}^{c} \sum_{u_{i} \in c_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&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; c^*_{j} = \frac{1}{|c_{j}|} \sum_{u_{i} \in c_{j}}^{} u_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&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;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c-1)&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt; Pawan Kumar, Mr. Pankaj Verma, Rakesh Shrma. Comparative analysis of Fuzzy C-mean and Hard C-mean algorithm [http://csjournals.com/IJITKM/PDF%203-1/39.pdf]&amp;lt;/ref&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход в &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 1. &#039;&#039;&#039;&#039;&#039;in&#039;&#039;&#039;&#039;&#039; - входные данные, &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - вычисление расстояния до кластерных центров и значение &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; единое для каждой группы &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - нахождение минимального расстояния до кластерных центров, &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - запись единички в столбец матрицы, &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - расчёт объектной функции, &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; — пересчёт кластерных центров, &#039;&#039;&#039;&#039;&#039;out&#039;&#039;&#039;&#039;&#039; — вывод полученных данных.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для одной итерации алгоритма в параллельном варианте требуется &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; раз последовательно выполнить для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; операций нахождения расстояния от элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
* &amp;lt;math&amp;gt;C-1&amp;lt;/math&amp;gt; сравнений, для нахождения минимального расстояния.&lt;br /&gt;
* операция записи единички в столбец матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Основным ресурсом алгоритма является вычисление квадрата нормы для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt;. Расчёт значения объектной функции &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; сложно представить в параллельном варианте, поэтому вычисление объектной функции производится последовательно.Использование параллельной реализации алгоритма приведёт к понижению производительности при небольшой размерности системы и малом объеме выборки. При параллельном варианте необходима пересылка данных, что при малом объеме выборки и небольшой размерности займет больше времени, чем при последовательном варианте.&lt;br /&gt;
Как легко видеть из информационного графа, высота [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] составляет &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;, ширина ЯПФ составляет &amp;lt;math&amp;gt;O(cK)&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;
# &amp;lt;math&amp;gt;\{u_k\}_{k=1}^{K}&amp;lt;/math&amp;gt; — исходный набор векторов, принадлежащие пространству &amp;lt;math&amp;gt;\mathbb{R}^n&amp;lt;/math&amp;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; &amp;lt;math&amp;gt;nK&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;M&amp;lt;/math&amp;gt; — матрица, принадлежащая пространству &amp;lt;math&amp;gt;\mathbb{R}^{c \times K}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &amp;lt;math&amp;gt;\{c_i\}_{i=1}^{c}&amp;lt;/math&amp;gt; — набор построенных кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;c(K+n)&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;
&#039;&#039;&#039;Достоинства:&#039;&#039;&#039; легкость реализации,вычислительная простота.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039; задание количества кластеров,отсутствие гарантии в нахождении оптимального решения.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13068</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13068"/>
		<updated>2016-10-17T22:24:28Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(cK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(nK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(c(K+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;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
&lt;br /&gt;
1.&#039;&#039;&#039;Инициализация: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Случайным образом определяются C векторов - центров кластеров&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;
3. &#039;&#039;&#039;Расчет оценочной функции:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Переопределение кластерных центров&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество наборов в &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;c_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{1}, c^*_{2}, ... c^*_{c}, M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{c} \sum_{u_{i} \in c_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;u_{1},u_{2}, ... u_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; c_{1},c_{2},...,c_{c}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K)\\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; c^*_{j} = \frac{1}{|c_{j}|} \sum_{u_{i} \in c_{j}}^{} c_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;|c_{j}| &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру &amp;lt;math&amp;gt;c_{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром данного алгоритма является вычисление на каждой итерации алгоритма квадратов норм между кластерными центрами и векторами из входного набор согласно формуле &amp;lt;math&amp;gt;\|u_k-c_i\|^2&amp;lt;/math&amp;gt;. На каждой итерации алгоритма происходит &amp;lt;math&amp;gt;CN&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;&lt;br /&gt;
\|u_k-c_i\|^2&lt;br /&gt;
&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;J=\sum_{j = 1}^{c} \sum_{u_{i} \in c_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&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; c^*_{j} = \frac{1}{|c_{j}|} \sum_{u_{i} \in c_{j}}^{} u_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&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;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c-1)&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt; Pawan Kumar, Mr. Pankaj Verma, Rakesh Shrma. Comparative analysis of Fuzzy C-mean and Hard C-mean algorithm [http://csjournals.com/IJITKM/PDF%203-1/39.pdf]&amp;lt;/ref&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход в &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 1. &#039;&#039;&#039;&#039;&#039;in&#039;&#039;&#039;&#039;&#039; - входные данные, &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - вычисление расстояния до кластерных центров и значение &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; единое для каждой группы &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - нахождение минимального расстояния до кластерных центров, &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - запись единички в столбец матрицы, &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - расчёт объектной функции, &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; — пересчёт кластерных центров, &#039;&#039;&#039;&#039;&#039;out&#039;&#039;&#039;&#039;&#039; — вывод полученных данных.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для одной итерации алгоритма в параллельном варианте требуется &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; раз последовательно выполнить для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; операций нахождения расстояния от элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
* &amp;lt;math&amp;gt;C-1&amp;lt;/math&amp;gt; сравнений, для нахождения минимального расстояния.&lt;br /&gt;
* операция записи единички в столбец матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Основным ресурсом алгоритма является вычисление квадрата нормы для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt;. Расчёт значения объектной функции &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; сложно представить в параллельном варианте, поэтому вычисление объектной функции производится последовательно.Использование параллельной реализации алгоритма приведёт к понижению производительности при небольшой размерности системы и малом объеме выборки. При параллельном варианте необходима пересылка данных, что при малом объеме выборки и небольшой размерности займет больше времени, чем при последовательном варианте.&lt;br /&gt;
Как легко видеть из информационного графа, высота [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] составляет &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;, ширина ЯПФ составляет &amp;lt;math&amp;gt;O(cK)&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;
# &amp;lt;math&amp;gt;\{u_k\}_{k=1}^{K}&amp;lt;/math&amp;gt; — исходный набор векторов, принадлежащие пространству &amp;lt;math&amp;gt;\mathbb{R}^n&amp;lt;/math&amp;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; &amp;lt;math&amp;gt;nK&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;M&amp;lt;/math&amp;gt; — матрица, принадлежащая пространству &amp;lt;math&amp;gt;\mathbb{R}^{c \times K}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &amp;lt;math&amp;gt;\{c_i\}_{i=1}^{c}&amp;lt;/math&amp;gt; — набор построенных кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;c(K+n)&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;
&#039;&#039;&#039;Достоинства:&#039;&#039;&#039; легкость реализации,вычислительная простота.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039; задание количества кластеров,отсутствие гарантии в нахождении оптимального решения.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13067</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13067"/>
		<updated>2016-10-17T22:22:50Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(cK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(nK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(c(K+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;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
&lt;br /&gt;
1.&#039;&#039;&#039;Инициализация: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Случайным образом определяются C векторов - центров кластеров&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;
3. &#039;&#039;&#039;Расчет оценочной функции:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Переопределение кластерных центров&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество наборов в &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;c_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{1}, c^*_{2}, ... c^*_{c}, M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{c} \sum_{u_{i} \in c_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;u_{1},u_{2}, ... u_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; c_{1},c_{2},...,c_{c}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K)\\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; c^*_{j} = \frac{1}{|c_{j}|} \sum_{u_{i} \in c_{j}}^{} c_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;|c_{j}| &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру &amp;lt;math&amp;gt;c_{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром данного алгоритма является вычисление на каждой итерации алгоритма квадратов норм между кластерными центрами и векторами из входного набор согласно формуле &amp;lt;math&amp;gt;\|u_k-c_i\|^2&amp;lt;/math&amp;gt;. На каждой итерации алгоритма происходит &amp;lt;math&amp;gt;CN&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;&lt;br /&gt;
\|u_k-c_i\|^2&lt;br /&gt;
&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;J=\sum_{j = 1}^{C} \sum_{x_{i} \in v_{j}}^{} \|x_{i}-v_{j}\|^2,  j \in 1,2, ... C, i={1,2, ...n}&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; v^*_{j} = \frac{1}{|v_{j}|} \sum_{x_{i} \in v_{j}}^{} x_{i}, j=1,2,3..,C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&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;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c-1)&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt; Pawan Kumar, Mr. Pankaj Verma, Rakesh Shrma. Comparative analysis of Fuzzy C-mean and Hard C-mean algorithm [http://csjournals.com/IJITKM/PDF%203-1/39.pdf]&amp;lt;/ref&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход в &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 1. &#039;&#039;&#039;&#039;&#039;in&#039;&#039;&#039;&#039;&#039; - входные данные, &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - вычисление расстояния до кластерных центров и значение &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; единое для каждой группы &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - нахождение минимального расстояния до кластерных центров, &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - запись единички в столбец матрицы, &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - расчёт объектной функции, &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; — пересчёт кластерных центров, &#039;&#039;&#039;&#039;&#039;out&#039;&#039;&#039;&#039;&#039; — вывод полученных данных.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для одной итерации алгоритма в параллельном варианте требуется &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; раз последовательно выполнить для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; операций нахождения расстояния от элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
* &amp;lt;math&amp;gt;C-1&amp;lt;/math&amp;gt; сравнений, для нахождения минимального расстояния.&lt;br /&gt;
* операция записи единички в столбец матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Основным ресурсом алгоритма является вычисление квадрата нормы для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt;. Расчёт значения объектной функции &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; сложно представить в параллельном варианте, поэтому вычисление объектной функции производится последовательно.Использование параллельной реализации алгоритма приведёт к понижению производительности при небольшой размерности системы и малом объеме выборки. При параллельном варианте необходима пересылка данных, что при малом объеме выборки и небольшой размерности займет больше времени, чем при последовательном варианте.&lt;br /&gt;
Как легко видеть из информационного графа, высота [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] составляет &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;, ширина ЯПФ составляет &amp;lt;math&amp;gt;O(cK)&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;
# &amp;lt;math&amp;gt;\{u_k\}_{k=1}^{K}&amp;lt;/math&amp;gt; — исходный набор векторов, принадлежащие пространству &amp;lt;math&amp;gt;\mathbb{R}^n&amp;lt;/math&amp;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; &amp;lt;math&amp;gt;nK&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;M&amp;lt;/math&amp;gt; — матрица, принадлежащая пространству &amp;lt;math&amp;gt;\mathbb{R}^{c \times K}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &amp;lt;math&amp;gt;\{c_i\}_{i=1}^{c}&amp;lt;/math&amp;gt; — набор построенных кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;c(K+n)&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;
&#039;&#039;&#039;Достоинства:&#039;&#039;&#039; легкость реализации,вычислительная простота.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039; задание количества кластеров,отсутствие гарантии в нахождении оптимального решения.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13066</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13066"/>
		<updated>2016-10-17T22:22:02Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(cK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(nK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(c(K+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;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
&lt;br /&gt;
1.&#039;&#039;&#039;Инициализация: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Случайным образом определяются C векторов - центров кластеров&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;
3. &#039;&#039;&#039;Расчет оценочной функции:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Переопределение кластерных центров&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество наборов в &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;c_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{1}, c^*_{2}, ... c^*_{c}, M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{c} \sum_{u_{i} \in c_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;u_{1},u_{2}, ... u_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; c_{1},c_{2},...,c_{c}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,C; \; k = 1,2,\ldots,N)\\&lt;br /&gt;
0, &amp;amp; \text{otherwise}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; c^*_{j} = \frac{1}{|c_{j}|} \sum_{u_{i} \in c_{j}}^{} c_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;|c_{j}| &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру &amp;lt;math&amp;gt;c_{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром данного алгоритма является вычисление на каждой итерации алгоритма квадратов норм между кластерными центрами и векторами из входного набор согласно формуле &amp;lt;math&amp;gt;\|u_k-c_i\|^2&amp;lt;/math&amp;gt;. На каждой итерации алгоритма происходит &amp;lt;math&amp;gt;CN&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;&lt;br /&gt;
\|u_k-c_i\|^2&lt;br /&gt;
&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;J=\sum_{j = 1}^{C} \sum_{x_{i} \in v_{j}}^{} \|x_{i}-v_{j}\|^2,  j \in 1,2, ... C, i={1,2, ...n}&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; v^*_{j} = \frac{1}{|v_{j}|} \sum_{x_{i} \in v_{j}}^{} x_{i}, j=1,2,3..,C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&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;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c-1)&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt; Pawan Kumar, Mr. Pankaj Verma, Rakesh Shrma. Comparative analysis of Fuzzy C-mean and Hard C-mean algorithm [http://csjournals.com/IJITKM/PDF%203-1/39.pdf]&amp;lt;/ref&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход в &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 1. &#039;&#039;&#039;&#039;&#039;in&#039;&#039;&#039;&#039;&#039; - входные данные, &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - вычисление расстояния до кластерных центров и значение &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; единое для каждой группы &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - нахождение минимального расстояния до кластерных центров, &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - запись единички в столбец матрицы, &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - расчёт объектной функции, &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; — пересчёт кластерных центров, &#039;&#039;&#039;&#039;&#039;out&#039;&#039;&#039;&#039;&#039; — вывод полученных данных.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для одной итерации алгоритма в параллельном варианте требуется &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; раз последовательно выполнить для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; операций нахождения расстояния от элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
* &amp;lt;math&amp;gt;C-1&amp;lt;/math&amp;gt; сравнений, для нахождения минимального расстояния.&lt;br /&gt;
* операция записи единички в столбец матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Основным ресурсом алгоритма является вычисление квадрата нормы для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt;. Расчёт значения объектной функции &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; сложно представить в параллельном варианте, поэтому вычисление объектной функции производится последовательно.Использование параллельной реализации алгоритма приведёт к понижению производительности при небольшой размерности системы и малом объеме выборки. При параллельном варианте необходима пересылка данных, что при малом объеме выборки и небольшой размерности займет больше времени, чем при последовательном варианте.&lt;br /&gt;
Как легко видеть из информационного графа, высота [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] составляет &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;, ширина ЯПФ составляет &amp;lt;math&amp;gt;O(cK)&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;
# &amp;lt;math&amp;gt;\{u_k\}_{k=1}^{K}&amp;lt;/math&amp;gt; — исходный набор векторов, принадлежащие пространству &amp;lt;math&amp;gt;\mathbb{R}^n&amp;lt;/math&amp;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; &amp;lt;math&amp;gt;nK&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;M&amp;lt;/math&amp;gt; — матрица, принадлежащая пространству &amp;lt;math&amp;gt;\mathbb{R}^{c \times K}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &amp;lt;math&amp;gt;\{c_i\}_{i=1}^{c}&amp;lt;/math&amp;gt; — набор построенных кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;c(K+n)&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;
&#039;&#039;&#039;Достоинства:&#039;&#039;&#039; легкость реализации,вычислительная простота.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039; задание количества кластеров,отсутствие гарантии в нахождении оптимального решения.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13065</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13065"/>
		<updated>2016-10-17T22:20:56Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(cK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(nK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(c(K+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;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
&lt;br /&gt;
1.&#039;&#039;&#039;Инициализация: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Случайным образом определяются C векторов - центров кластеров&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;
3. &#039;&#039;&#039;Расчет оценочной функции:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Переопределение кластерных центров&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество наборов в &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;c_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;c_{1}, c_{2}, ... c_{c}, M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{c} \sum_{u_{i} \in c_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;u_{1},u_{2}, ... u_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; c_{1},c_{2},...,c_{c}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,C; \; k = 1,2,\ldots,N)\\&lt;br /&gt;
0, &amp;amp; \text{otherwise}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; c^*_{j} = \frac{1}{|c_{j}|} \sum_{u_{i} \in c_{j}}^{} c_{i}, j=1,2,3..,c&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;|c_{j}| &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру &amp;lt;math&amp;gt;c_{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром данного алгоритма является вычисление на каждой итерации алгоритма квадратов норм между кластерными центрами и векторами из входного набор согласно формуле &amp;lt;math&amp;gt;\|u_k-c_i\|^2&amp;lt;/math&amp;gt;. На каждой итерации алгоритма происходит &amp;lt;math&amp;gt;CN&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;&lt;br /&gt;
\|u_k-c_i\|^2&lt;br /&gt;
&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;J=\sum_{j = 1}^{C} \sum_{x_{i} \in v_{j}}^{} \|x_{i}-v_{j}\|^2,  j \in 1,2, ... C, i={1,2, ...n}&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; v^*_{j} = \frac{1}{|v_{j}|} \sum_{x_{i} \in v_{j}}^{} x_{i}, j=1,2,3..,C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&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;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c-1)&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt; Pawan Kumar, Mr. Pankaj Verma, Rakesh Shrma. Comparative analysis of Fuzzy C-mean and Hard C-mean algorithm [http://csjournals.com/IJITKM/PDF%203-1/39.pdf]&amp;lt;/ref&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход в &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 1. &#039;&#039;&#039;&#039;&#039;in&#039;&#039;&#039;&#039;&#039; - входные данные, &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - вычисление расстояния до кластерных центров и значение &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; единое для каждой группы &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - нахождение минимального расстояния до кластерных центров, &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - запись единички в столбец матрицы, &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - расчёт объектной функции, &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; — пересчёт кластерных центров, &#039;&#039;&#039;&#039;&#039;out&#039;&#039;&#039;&#039;&#039; — вывод полученных данных.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для одной итерации алгоритма в параллельном варианте требуется &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; раз последовательно выполнить для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; операций нахождения расстояния от элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
* &amp;lt;math&amp;gt;C-1&amp;lt;/math&amp;gt; сравнений, для нахождения минимального расстояния.&lt;br /&gt;
* операция записи единички в столбец матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Основным ресурсом алгоритма является вычисление квадрата нормы для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt;. Расчёт значения объектной функции &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; сложно представить в параллельном варианте, поэтому вычисление объектной функции производится последовательно.Использование параллельной реализации алгоритма приведёт к понижению производительности при небольшой размерности системы и малом объеме выборки. При параллельном варианте необходима пересылка данных, что при малом объеме выборки и небольшой размерности займет больше времени, чем при последовательном варианте.&lt;br /&gt;
Как легко видеть из информационного графа, высота [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] составляет &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;, ширина ЯПФ составляет &amp;lt;math&amp;gt;O(cK)&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;
# &amp;lt;math&amp;gt;\{u_k\}_{k=1}^{K}&amp;lt;/math&amp;gt; — исходный набор векторов, принадлежащие пространству &amp;lt;math&amp;gt;\mathbb{R}^n&amp;lt;/math&amp;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; &amp;lt;math&amp;gt;nK&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;M&amp;lt;/math&amp;gt; — матрица, принадлежащая пространству &amp;lt;math&amp;gt;\mathbb{R}^{c \times K}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &amp;lt;math&amp;gt;\{c_i\}_{i=1}^{c}&amp;lt;/math&amp;gt; — набор построенных кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;c(K+n)&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;
&#039;&#039;&#039;Достоинства:&#039;&#039;&#039; легкость реализации,вычислительная простота.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039; задание количества кластеров,отсутствие гарантии в нахождении оптимального решения.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13064</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13064"/>
		<updated>2016-10-17T22:19:52Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(cK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(nK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(c(K+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;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
&lt;br /&gt;
1.&#039;&#039;&#039;Инициализация: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Случайным образом определяются C векторов - центров кластеров&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;
3. &#039;&#039;&#039;Расчет оценочной функции:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Переопределение кластерных центров&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество наборов в &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;c_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;c_{1}, c_{2}, ... c_{c}, M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{c} \sum_{u_{i} \in c_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;u_{1},u_{2}, ... u_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; c_{1},c_{2},...,c_{c}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,C; \; k = 1,2,\ldots,N)\\&lt;br /&gt;
0, &amp;amp; \text{otherwise}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; v^*_{j} = \frac{1}{|v_{j}|} \sum_{x_{i} \in v_{j}}^{} x_{i}, j=1,2,3..,C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;|v_{j}| &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру &amp;lt;math&amp;gt;v_{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром данного алгоритма является вычисление на каждой итерации алгоритма квадратов норм между кластерными центрами и векторами из входного набор согласно формуле &amp;lt;math&amp;gt;\|u_k-c_i\|^2&amp;lt;/math&amp;gt;. На каждой итерации алгоритма происходит &amp;lt;math&amp;gt;CN&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;&lt;br /&gt;
\|u_k-c_i\|^2&lt;br /&gt;
&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;J=\sum_{j = 1}^{C} \sum_{x_{i} \in v_{j}}^{} \|x_{i}-v_{j}\|^2,  j \in 1,2, ... C, i={1,2, ...n}&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; v^*_{j} = \frac{1}{|v_{j}|} \sum_{x_{i} \in v_{j}}^{} x_{i}, j=1,2,3..,C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&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;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c-1)&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt; Pawan Kumar, Mr. Pankaj Verma, Rakesh Shrma. Comparative analysis of Fuzzy C-mean and Hard C-mean algorithm [http://csjournals.com/IJITKM/PDF%203-1/39.pdf]&amp;lt;/ref&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход в &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 1. &#039;&#039;&#039;&#039;&#039;in&#039;&#039;&#039;&#039;&#039; - входные данные, &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - вычисление расстояния до кластерных центров и значение &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; единое для каждой группы &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - нахождение минимального расстояния до кластерных центров, &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - запись единички в столбец матрицы, &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - расчёт объектной функции, &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; — пересчёт кластерных центров, &#039;&#039;&#039;&#039;&#039;out&#039;&#039;&#039;&#039;&#039; — вывод полученных данных.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для одной итерации алгоритма в параллельном варианте требуется &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; раз последовательно выполнить для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; операций нахождения расстояния от элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
* &amp;lt;math&amp;gt;C-1&amp;lt;/math&amp;gt; сравнений, для нахождения минимального расстояния.&lt;br /&gt;
* операция записи единички в столбец матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Основным ресурсом алгоритма является вычисление квадрата нормы для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt;. Расчёт значения объектной функции &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; сложно представить в параллельном варианте, поэтому вычисление объектной функции производится последовательно.Использование параллельной реализации алгоритма приведёт к понижению производительности при небольшой размерности системы и малом объеме выборки. При параллельном варианте необходима пересылка данных, что при малом объеме выборки и небольшой размерности займет больше времени, чем при последовательном варианте.&lt;br /&gt;
Как легко видеть из информационного графа, высота [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] составляет &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;, ширина ЯПФ составляет &amp;lt;math&amp;gt;O(cK)&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;
# &amp;lt;math&amp;gt;\{u_k\}_{k=1}^{K}&amp;lt;/math&amp;gt; — исходный набор векторов, принадлежащие пространству &amp;lt;math&amp;gt;\mathbb{R}^n&amp;lt;/math&amp;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; &amp;lt;math&amp;gt;nK&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;M&amp;lt;/math&amp;gt; — матрица, принадлежащая пространству &amp;lt;math&amp;gt;\mathbb{R}^{c \times K}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &amp;lt;math&amp;gt;\{c_i\}_{i=1}^{c}&amp;lt;/math&amp;gt; — набор построенных кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;c(K+n)&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;
&#039;&#039;&#039;Достоинства:&#039;&#039;&#039; легкость реализации,вычислительная простота.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039; задание количества кластеров,отсутствие гарантии в нахождении оптимального решения.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13063</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13063"/>
		<updated>2016-10-17T22:19:02Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(cK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(nK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(c(K+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;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
&lt;br /&gt;
1.&#039;&#039;&#039;Инициализация: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Случайным образом определяются C векторов - центров кластеров&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;
3. &#039;&#039;&#039;Расчет оценочной функции:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Переопределение кластерных центров&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество наборов в &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;c_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;M_{1}, M_{2}, ... M_{C}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{c} \sum_{u_{i} \in c_{j}}^{} \|u_{i}-c_{j}\|^2,  j \in 1,2, ... c, i={1,2, ...K}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;u_{1},u_{2}, ... u_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; c_{1},c_{2},...,c_{c}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,C; \; k = 1,2,\ldots,N)\\&lt;br /&gt;
0, &amp;amp; \text{otherwise}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; v^*_{j} = \frac{1}{|v_{j}|} \sum_{x_{i} \in v_{j}}^{} x_{i}, j=1,2,3..,C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;|v_{j}| &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру &amp;lt;math&amp;gt;v_{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром данного алгоритма является вычисление на каждой итерации алгоритма квадратов норм между кластерными центрами и векторами из входного набор согласно формуле &amp;lt;math&amp;gt;\|u_k-c_i\|^2&amp;lt;/math&amp;gt;. На каждой итерации алгоритма происходит &amp;lt;math&amp;gt;CN&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;&lt;br /&gt;
\|u_k-c_i\|^2&lt;br /&gt;
&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;J=\sum_{j = 1}^{C} \sum_{x_{i} \in v_{j}}^{} \|x_{i}-v_{j}\|^2,  j \in 1,2, ... C, i={1,2, ...n}&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; v^*_{j} = \frac{1}{|v_{j}|} \sum_{x_{i} \in v_{j}}^{} x_{i}, j=1,2,3..,C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&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;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c-1)&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt; Pawan Kumar, Mr. Pankaj Verma, Rakesh Shrma. Comparative analysis of Fuzzy C-mean and Hard C-mean algorithm [http://csjournals.com/IJITKM/PDF%203-1/39.pdf]&amp;lt;/ref&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход в &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 1. &#039;&#039;&#039;&#039;&#039;in&#039;&#039;&#039;&#039;&#039; - входные данные, &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - вычисление расстояния до кластерных центров и значение &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; единое для каждой группы &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - нахождение минимального расстояния до кластерных центров, &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - запись единички в столбец матрицы, &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - расчёт объектной функции, &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; — пересчёт кластерных центров, &#039;&#039;&#039;&#039;&#039;out&#039;&#039;&#039;&#039;&#039; — вывод полученных данных.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для одной итерации алгоритма в параллельном варианте требуется &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; раз последовательно выполнить для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; операций нахождения расстояния от элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
* &amp;lt;math&amp;gt;C-1&amp;lt;/math&amp;gt; сравнений, для нахождения минимального расстояния.&lt;br /&gt;
* операция записи единички в столбец матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Основным ресурсом алгоритма является вычисление квадрата нормы для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt;. Расчёт значения объектной функции &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; сложно представить в параллельном варианте, поэтому вычисление объектной функции производится последовательно.Использование параллельной реализации алгоритма приведёт к понижению производительности при небольшой размерности системы и малом объеме выборки. При параллельном варианте необходима пересылка данных, что при малом объеме выборки и небольшой размерности займет больше времени, чем при последовательном варианте.&lt;br /&gt;
Как легко видеть из информационного графа, высота [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] составляет &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;, ширина ЯПФ составляет &amp;lt;math&amp;gt;O(cK)&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;
# &amp;lt;math&amp;gt;\{u_k\}_{k=1}^{K}&amp;lt;/math&amp;gt; — исходный набор векторов, принадлежащие пространству &amp;lt;math&amp;gt;\mathbb{R}^n&amp;lt;/math&amp;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; &amp;lt;math&amp;gt;nK&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;M&amp;lt;/math&amp;gt; — матрица, принадлежащая пространству &amp;lt;math&amp;gt;\mathbb{R}^{c \times K}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &amp;lt;math&amp;gt;\{c_i\}_{i=1}^{c}&amp;lt;/math&amp;gt; — набор построенных кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;c(K+n)&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;
&#039;&#039;&#039;Достоинства:&#039;&#039;&#039; легкость реализации,вычислительная простота.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039; задание количества кластеров,отсутствие гарантии в нахождении оптимального решения.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13062</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13062"/>
		<updated>2016-10-17T22:17:52Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(cK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(nK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(c(K+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;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
&lt;br /&gt;
1.&#039;&#039;&#039;Инициализация: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Случайным образом определяются C векторов - центров кластеров&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;
3. &#039;&#039;&#039;Расчет оценочной функции:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Переопределение кластерных центров&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество наборов в &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;c_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;M_{1}, M_{2}, ... M_{C}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{C} \sum_{x_{i} \in v_{j}}^{} \|x_{i}-v_{j}\|^2,  j \in 1,2, ... C, i={1,2, ...n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;u_{1},u_{2}, ... u_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; c_{1},c_{2},...,c_{c}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,C; \; k = 1,2,\ldots,N)\\&lt;br /&gt;
0, &amp;amp; \text{otherwise}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; v^*_{j} = \frac{1}{|v_{j}|} \sum_{x_{i} \in v_{j}}^{} x_{i}, j=1,2,3..,C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;|v_{j}| &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру &amp;lt;math&amp;gt;v_{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром данного алгоритма является вычисление на каждой итерации алгоритма квадратов норм между кластерными центрами и векторами из входного набор согласно формуле &amp;lt;math&amp;gt;\|u_k-c_i\|^2&amp;lt;/math&amp;gt;. На каждой итерации алгоритма происходит &amp;lt;math&amp;gt;CN&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;&lt;br /&gt;
\|u_k-c_i\|^2&lt;br /&gt;
&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;J=\sum_{j = 1}^{C} \sum_{x_{i} \in v_{j}}^{} \|x_{i}-v_{j}\|^2,  j \in 1,2, ... C, i={1,2, ...n}&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; v^*_{j} = \frac{1}{|v_{j}|} \sum_{x_{i} \in v_{j}}^{} x_{i}, j=1,2,3..,C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&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;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c-1)&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt; Pawan Kumar, Mr. Pankaj Verma, Rakesh Shrma. Comparative analysis of Fuzzy C-mean and Hard C-mean algorithm [http://csjournals.com/IJITKM/PDF%203-1/39.pdf]&amp;lt;/ref&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход в &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 1. &#039;&#039;&#039;&#039;&#039;in&#039;&#039;&#039;&#039;&#039; - входные данные, &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - вычисление расстояния до кластерных центров и значение &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; единое для каждой группы &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - нахождение минимального расстояния до кластерных центров, &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - запись единички в столбец матрицы, &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - расчёт объектной функции, &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; — пересчёт кластерных центров, &#039;&#039;&#039;&#039;&#039;out&#039;&#039;&#039;&#039;&#039; — вывод полученных данных.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для одной итерации алгоритма в параллельном варианте требуется &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; раз последовательно выполнить для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; операций нахождения расстояния от элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
* &amp;lt;math&amp;gt;C-1&amp;lt;/math&amp;gt; сравнений, для нахождения минимального расстояния.&lt;br /&gt;
* операция записи единички в столбец матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Основным ресурсом алгоритма является вычисление квадрата нормы для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt;. Расчёт значения объектной функции &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; сложно представить в параллельном варианте, поэтому вычисление объектной функции производится последовательно.Использование параллельной реализации алгоритма приведёт к понижению производительности при небольшой размерности системы и малом объеме выборки. При параллельном варианте необходима пересылка данных, что при малом объеме выборки и небольшой размерности займет больше времени, чем при последовательном варианте.&lt;br /&gt;
Как легко видеть из информационного графа, высота [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] составляет &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;, ширина ЯПФ составляет &amp;lt;math&amp;gt;O(cK)&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;
# &amp;lt;math&amp;gt;\{u_k\}_{k=1}^{K}&amp;lt;/math&amp;gt; — исходный набор векторов, принадлежащие пространству &amp;lt;math&amp;gt;\mathbb{R}^n&amp;lt;/math&amp;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; &amp;lt;math&amp;gt;nK&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;M&amp;lt;/math&amp;gt; — матрица, принадлежащая пространству &amp;lt;math&amp;gt;\mathbb{R}^{c \times K}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &amp;lt;math&amp;gt;\{c_i\}_{i=1}^{c}&amp;lt;/math&amp;gt; — набор построенных кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;c(K+n)&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;
&#039;&#039;&#039;Достоинства:&#039;&#039;&#039; легкость реализации,вычислительная простота.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039; задание количества кластеров,отсутствие гарантии в нахождении оптимального решения.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13061</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13061"/>
		<updated>2016-10-17T22:17:05Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(cK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(nK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(c(K+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;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
&lt;br /&gt;
1.&#039;&#039;&#039;Инициализация: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Случайным образом определяются C векторов - центров кластеров&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;
3. &#039;&#039;&#039;Расчет оценочной функции:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Переопределение кластерных центров&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество наборов в &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;c_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;M_{1}, M_{2}, ... M_{C}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{C} \sum_{x_{i} \in v_{j}}^{} \|x_{i}-v_{j}\|^2,  j \in 1,2, ... C, i={1,2, ...n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;X_{1},X_{2}, ... X_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; v_{1},v_{2},...,v_{C}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,C; \; k = 1,2,\ldots,N)\\&lt;br /&gt;
0, &amp;amp; \text{otherwise}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; v^*_{j} = \frac{1}{|v_{j}|} \sum_{x_{i} \in v_{j}}^{} x_{i}, j=1,2,3..,C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;|v_{j}| &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру &amp;lt;math&amp;gt;v_{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром данного алгоритма является вычисление на каждой итерации алгоритма квадратов норм между кластерными центрами и векторами из входного набор согласно формуле &amp;lt;math&amp;gt;\|u_k-c_i\|^2&amp;lt;/math&amp;gt;. На каждой итерации алгоритма происходит &amp;lt;math&amp;gt;CN&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;&lt;br /&gt;
\|u_k-c_i\|^2&lt;br /&gt;
&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;J=\sum_{j = 1}^{C} \sum_{x_{i} \in v_{j}}^{} \|x_{i}-v_{j}\|^2,  j \in 1,2, ... C, i={1,2, ...n}&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; v^*_{j} = \frac{1}{|v_{j}|} \sum_{x_{i} \in v_{j}}^{} x_{i}, j=1,2,3..,C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&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;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c-1)&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt; Pawan Kumar, Mr. Pankaj Verma, Rakesh Shrma. Comparative analysis of Fuzzy C-mean and Hard C-mean algorithm [http://csjournals.com/IJITKM/PDF%203-1/39.pdf]&amp;lt;/ref&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход в &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 1. &#039;&#039;&#039;&#039;&#039;in&#039;&#039;&#039;&#039;&#039; - входные данные, &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - вычисление расстояния до кластерных центров и значение &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; единое для каждой группы &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - нахождение минимального расстояния до кластерных центров, &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - запись единички в столбец матрицы, &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - расчёт объектной функции, &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; — пересчёт кластерных центров, &#039;&#039;&#039;&#039;&#039;out&#039;&#039;&#039;&#039;&#039; — вывод полученных данных.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для одной итерации алгоритма в параллельном варианте требуется &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; раз последовательно выполнить для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; операций нахождения расстояния от элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
* &amp;lt;math&amp;gt;C-1&amp;lt;/math&amp;gt; сравнений, для нахождения минимального расстояния.&lt;br /&gt;
* операция записи единички в столбец матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Основным ресурсом алгоритма является вычисление квадрата нормы для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt;. Расчёт значения объектной функции &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; сложно представить в параллельном варианте, поэтому вычисление объектной функции производится последовательно.Использование параллельной реализации алгоритма приведёт к понижению производительности при небольшой размерности системы и малом объеме выборки. При параллельном варианте необходима пересылка данных, что при малом объеме выборки и небольшой размерности займет больше времени, чем при последовательном варианте.&lt;br /&gt;
Как легко видеть из информационного графа, высота [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] составляет &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;, ширина ЯПФ составляет &amp;lt;math&amp;gt;O(cK)&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;
# &amp;lt;math&amp;gt;\{u_k\}_{k=1}^{K}&amp;lt;/math&amp;gt; — исходный набор векторов, принадлежащие пространству &amp;lt;math&amp;gt;\mathbb{R}^n&amp;lt;/math&amp;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; &amp;lt;math&amp;gt;nK&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;M&amp;lt;/math&amp;gt; — матрица, принадлежащая пространству &amp;lt;math&amp;gt;\mathbb{R}^{c \times K}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &amp;lt;math&amp;gt;\{c_i\}_{i=1}^{c}&amp;lt;/math&amp;gt; — набор построенных кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;c(K+n)&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;
&#039;&#039;&#039;Достоинства:&#039;&#039;&#039; легкость реализации,вычислительная простота.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039; задание количества кластеров,отсутствие гарантии в нахождении оптимального решения.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13060</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13060"/>
		<updated>2016-10-17T22:16:14Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(cK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(nK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(c(K+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;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
&lt;br /&gt;
1.&#039;&#039;&#039;Инициализация: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Случайным образом определяются C векторов - центров кластеров&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;
3. &#039;&#039;&#039;Расчет оценочной функции:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Переопределение кластерных центров&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество наборов в &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;c_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;M_{1}, M_{2}, ... M_{C}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{C} \sum_{x_{i} \in v_{j}}^{} \|x_{i}-v_{j}\|^2,  j \in 1,2, ... C, i={1,2, ...n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;X_{1},X_{2}, ... X_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; v_{1},v_{2},...,v_{C}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,C; \; k = 1,2,\ldots,N)\\&lt;br /&gt;
0, &amp;amp; \text{otherwise}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; v^*_{j} = \frac{1}{|v_{j}|} \sum_{x_{i} \in v_{j}}^{} x_{i}, j=1,2,3..,C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;|v_{j}| &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру &amp;lt;math&amp;gt;v_{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром данного алгоритма является вычисление на каждой итерации алгоритма квадратов норм между кластерными центрами и векторами из входного набор согласно формуле &amp;lt;math&amp;gt;\|u_k-c_i\|^2&amp;lt;/math&amp;gt;. На каждой итерации алгоритма происходит &amp;lt;math&amp;gt;CN&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;&lt;br /&gt;
\|u_k-c_i\|^2&lt;br /&gt;
&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;J=\sum_{j = 1}^{C} \sum_{x_{i} \in v_{j}}^{} \|x_{i}-v_{j}\|^2,  j \in 1,2, ... C, i={1,2, ...n}&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; v^*_{j} = \frac{1}{|v_{j}|} \sum_{x_{i} \in v_{j}}^{} x_{i}, j=1,2,3..,C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&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;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c-1)&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt; Pawan Kumar, Mr. Pankaj Verma, Rakesh Shrma. Comparative analysis of Fuzzy C-mean and Hard C-mean algorithm [http://csjournals.com/IJITKM/PDF%203-1/39.pdf]&amp;lt;/ref&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход в &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 1. &#039;&#039;&#039;&#039;&#039;in&#039;&#039;&#039;&#039;&#039; - входные данные, &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - вычисление расстояния до кластерных центров и значение &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; единое для каждой группы &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - нахождение минимального расстояния до кластерных центров, &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - запись единички в столбец матрицы, &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - расчёт объектной функции, &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; — пересчёт кластерных центров, &#039;&#039;&#039;&#039;&#039;out&#039;&#039;&#039;&#039;&#039; — вывод полученных данных.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для одной итерации алгоритма в параллельном варианте требуется &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; раз последовательно выполнить для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; операций нахождения расстояния от элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
* &amp;lt;math&amp;gt;C-1&amp;lt;/math&amp;gt; сравнений, для нахождения минимального расстояния.&lt;br /&gt;
* операция записи единички в столбец матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Основным ресурсом алгоритма является вычисление квадрата нормы для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt;. Расчёт значения объектной функции &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; сложно представить в параллельном варианте, поэтому вычисление объектной функции производится последовательно.Использование параллельной реализации алгоритма приведёт к понижению производительности при небольшой размерности системы и малом объеме выборки. При параллельном варианте необходима пересылка данных, что при малом объеме выборки и небольшой размерности займет больше времени, чем при последовательном варианте.&lt;br /&gt;
Как легко видеть из информационного графа, высота [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] составляет &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;, ширина ЯПФ составляет &amp;lt;math&amp;gt;O(cK)&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;
# &amp;lt;math&amp;gt;\{u_k\}_{k=1}^{K}&amp;lt;/math&amp;gt; — исходный набор векторов, принадлежащие пространству &amp;lt;math&amp;gt;\mathbb{R}^n&amp;lt;/math&amp;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; &amp;lt;math&amp;gt;nK&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;M&amp;lt;/math&amp;gt; — матрица, принадлежащая пространству &amp;lt;math&amp;gt;\mathbb{R}^{c \times K}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &amp;lt;math&amp;gt;\{c_i\}_{i=1}^{c}&amp;lt;/math&amp;gt; — набор построенных кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;c(K+n)&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;
&#039;&#039;&#039;Достоинства:&#039;&#039;&#039; легкость реализации,вычислительная простота.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039; задание количества кластеров,отсутствие гарантии в нахождении оптимального решения.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13058</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13058"/>
		<updated>2016-10-17T22:12:26Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(cK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(nK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(c(K+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;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
&lt;br /&gt;
1.&#039;&#039;&#039;Инициализация: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Случайным образом определяются C векторов - центров кластеров&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;
3. &#039;&#039;&#039;Расчет оценочной функции:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Переопределение кластерных центров&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;X&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;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;v_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;v^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;V_{1}, V_{2}, ... V_{C}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{C} \sum_{x_{i} \in v_{j}}^{} \|x_{i}-v_{j}\|^2,  j \in 1,2, ... C, i={1,2, ...n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;X_{1},X_{2}, ... X_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; v_{1},v_{2},...,v_{C}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,C; \; k = 1,2,\ldots,N)\\&lt;br /&gt;
0, &amp;amp; \text{otherwise}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; v^*_{j} = \frac{1}{|v_{j}|} \sum_{x_{i} \in v_{j}}^{} x_{i}, j=1,2,3..,C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;|v_{j}| &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру &amp;lt;math&amp;gt;v_{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром данного алгоритма является вычисление на каждой итерации алгоритма квадратов норм между кластерными центрами и векторами из входного набор согласно формуле &amp;lt;math&amp;gt;\|u_k-c_i\|^2&amp;lt;/math&amp;gt;. На каждой итерации алгоритма происходит &amp;lt;math&amp;gt;CN&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;&lt;br /&gt;
\|u_k-c_i\|^2&lt;br /&gt;
&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;J=\sum_{j = 1}^{C} \sum_{x_{i} \in v_{j}}^{} \|x_{i}-v_{j}\|^2,  j \in 1,2, ... C, i={1,2, ...n}&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; v^*_{j} = \frac{1}{|v_{j}|} \sum_{x_{i} \in v_{j}}^{} x_{i}, j=1,2,3..,C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&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;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c-1)&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt; Pawan Kumar, Mr. Pankaj Verma, Rakesh Shrma. Comparative analysis of Fuzzy C-mean and Hard C-mean algorithm [http://csjournals.com/IJITKM/PDF%203-1/39.pdf]&amp;lt;/ref&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход в &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 1. &#039;&#039;&#039;&#039;&#039;in&#039;&#039;&#039;&#039;&#039; - входные данные, &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - вычисление расстояния до кластерных центров и значение &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; единое для каждой группы &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - нахождение минимального расстояния до кластерных центров, &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - запись единички в столбец матрицы, &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - расчёт объектной функции, &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; — пересчёт кластерных центров, &#039;&#039;&#039;&#039;&#039;out&#039;&#039;&#039;&#039;&#039; — вывод полученных данных.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для одной итерации алгоритма в параллельном варианте требуется &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; раз последовательно выполнить для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; операций нахождения расстояния от элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
* &amp;lt;math&amp;gt;C-1&amp;lt;/math&amp;gt; сравнений, для нахождения минимального расстояния.&lt;br /&gt;
* операция записи единички в столбец матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Основным ресурсом алгоритма является вычисление квадрата нормы для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt;. Расчёт значения объектной функции &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; сложно представить в параллельном варианте, поэтому вычисление объектной функции производится последовательно.Использование параллельной реализации алгоритма приведёт к понижению производительности при небольшой размерности системы и малом объеме выборки. При параллельном варианте необходима пересылка данных, что при малом объеме выборки и небольшой размерности займет больше времени, чем при последовательном варианте.&lt;br /&gt;
Как легко видеть из информационного графа, высота [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] составляет &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;, ширина ЯПФ составляет &amp;lt;math&amp;gt;O(cK)&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;
# &amp;lt;math&amp;gt;\{u_k\}_{k=1}^{K}&amp;lt;/math&amp;gt; — исходный набор векторов, принадлежащие пространству &amp;lt;math&amp;gt;\mathbb{R}^n&amp;lt;/math&amp;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; &amp;lt;math&amp;gt;nK&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;M&amp;lt;/math&amp;gt; — матрица, принадлежащая пространству &amp;lt;math&amp;gt;\mathbb{R}^{c \times K}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &amp;lt;math&amp;gt;\{c_i\}_{i=1}^{c}&amp;lt;/math&amp;gt; — набор построенных кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;c(K+n)&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;
&#039;&#039;&#039;Достоинства:&#039;&#039;&#039; легкость реализации,вычислительная простота.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039; задание количества кластеров,отсутствие гарантии в нахождении оптимального решения.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13057</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13057"/>
		<updated>2016-10-17T22:11:56Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(cK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(nK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(c(K+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;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
&lt;br /&gt;
1.&#039;&#039;&#039;Инициализация: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Случайным образом определяются C векторов - центров кластеров&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;
3. &#039;&#039;&#039;Расчет оценочной функции:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Переопределение кластерных центров&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;X&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;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;v_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;v^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;V_{1}, V_{2}, ... V_{C}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{C} \sum_{x_{i} \in v_{j}}^{} \|x_{i}-v_{j}\|^2,  j \in 1,2, ... C, i={1,2, ...n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;X_{1},X_{2}, ... X_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; v_{1},v_{2},...,v_{C}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,C; \; k = 1,2,\ldots,N)\\&lt;br /&gt;
0, &amp;amp; \text{otherwise}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; v^*_{j} = \frac{1}{|v_{j}|} \sum_{x_{i} \in v_{j}}^{} x_{i}, j=1,2,3..,C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;|v_{j}| &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру &amp;lt;math&amp;gt;v_{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром данного алгоритма является вычисление на каждой итерации алгоритма квадратов норм между кластерными центрами и векторами из входного набор согласно формуле &amp;lt;math&amp;gt;\|u_k-c_i\|^2&amp;lt;/math&amp;gt;. На каждой итерации алгоритма происходит &amp;lt;math&amp;gt;CN&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;&lt;br /&gt;
\|u_k-c_i\|^2&lt;br /&gt;
&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;J=\sum_{j = 1}^{C} \sum_{x_{i} \in v_{j}}^{} \|x_{i}-v_{j}\|^2,  j \in 1,2, ... C, i={1,2, ...n}&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;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&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;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c-1)&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt; Pawan Kumar, Mr. Pankaj Verma, Rakesh Shrma. Comparative analysis of Fuzzy C-mean and Hard C-mean algorithm [http://csjournals.com/IJITKM/PDF%203-1/39.pdf]&amp;lt;/ref&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход в &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 1. &#039;&#039;&#039;&#039;&#039;in&#039;&#039;&#039;&#039;&#039; - входные данные, &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - вычисление расстояния до кластерных центров и значение &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; единое для каждой группы &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - нахождение минимального расстояния до кластерных центров, &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - запись единички в столбец матрицы, &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - расчёт объектной функции, &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; — пересчёт кластерных центров, &#039;&#039;&#039;&#039;&#039;out&#039;&#039;&#039;&#039;&#039; — вывод полученных данных.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для одной итерации алгоритма в параллельном варианте требуется &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; раз последовательно выполнить для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; операций нахождения расстояния от элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
* &amp;lt;math&amp;gt;C-1&amp;lt;/math&amp;gt; сравнений, для нахождения минимального расстояния.&lt;br /&gt;
* операция записи единички в столбец матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Основным ресурсом алгоритма является вычисление квадрата нормы для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt;. Расчёт значения объектной функции &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; сложно представить в параллельном варианте, поэтому вычисление объектной функции производится последовательно.Использование параллельной реализации алгоритма приведёт к понижению производительности при небольшой размерности системы и малом объеме выборки. При параллельном варианте необходима пересылка данных, что при малом объеме выборки и небольшой размерности займет больше времени, чем при последовательном варианте.&lt;br /&gt;
Как легко видеть из информационного графа, высота [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] составляет &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;, ширина ЯПФ составляет &amp;lt;math&amp;gt;O(cK)&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;
# &amp;lt;math&amp;gt;\{u_k\}_{k=1}^{K}&amp;lt;/math&amp;gt; — исходный набор векторов, принадлежащие пространству &amp;lt;math&amp;gt;\mathbb{R}^n&amp;lt;/math&amp;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; &amp;lt;math&amp;gt;nK&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;M&amp;lt;/math&amp;gt; — матрица, принадлежащая пространству &amp;lt;math&amp;gt;\mathbb{R}^{c \times K}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &amp;lt;math&amp;gt;\{c_i\}_{i=1}^{c}&amp;lt;/math&amp;gt; — набор построенных кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;c(K+n)&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;
&#039;&#039;&#039;Достоинства:&#039;&#039;&#039; легкость реализации,вычислительная простота.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039; задание количества кластеров,отсутствие гарантии в нахождении оптимального решения.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13056</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13056"/>
		<updated>2016-10-17T22:11:29Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(cK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(nK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(c(K+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;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
&lt;br /&gt;
1.&#039;&#039;&#039;Инициализация: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Случайным образом определяются C векторов - центров кластеров&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;
3. &#039;&#039;&#039;Расчет оценочной функции:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Переопределение кластерных центров&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;X&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;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;v_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;v^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;V_{1}, V_{2}, ... V_{C}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{C} \sum_{x_{i} \in v_{j}}^{} \|x_{i}-v_{j}\|^2,  j \in 1,2, ... C, i={1,2, ...n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;X_{1},X_{2}, ... X_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; v_{1},v_{2},...,v_{C}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,C; \; k = 1,2,\ldots,N)\\&lt;br /&gt;
0, &amp;amp; \text{otherwise}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; v^*_{j} = \frac{1}{|v_{j}|} \sum_{x_{i} \in v_{j}}^{} x_{i}, j=1,2,3..,C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;|v_{j}| &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру &amp;lt;math&amp;gt;v_{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром данного алгоритма является вычисление на каждой итерации алгоритма квадратов норм между кластерными центрами и векторами из входного набор согласно формуле &amp;lt;math&amp;gt;\|u_k-c_i\|^2&amp;lt;/math&amp;gt;. На каждой итерации алгоритма происходит &amp;lt;math&amp;gt;CN&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;&lt;br /&gt;
d_{ki} = \|u_k-c_i\|^2&lt;br /&gt;
&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;J=\sum_{j = 1}^{C} \sum_{x_{i} \in v_{j}}^{} \|x_{i}-v_{j}\|^2,  j \in 1,2, ... C, i={1,2, ...n}&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;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&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;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c-1)&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt; Pawan Kumar, Mr. Pankaj Verma, Rakesh Shrma. Comparative analysis of Fuzzy C-mean and Hard C-mean algorithm [http://csjournals.com/IJITKM/PDF%203-1/39.pdf]&amp;lt;/ref&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход в &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 1. &#039;&#039;&#039;&#039;&#039;in&#039;&#039;&#039;&#039;&#039; - входные данные, &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - вычисление расстояния до кластерных центров и значение &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; единое для каждой группы &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - нахождение минимального расстояния до кластерных центров, &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - запись единички в столбец матрицы, &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - расчёт объектной функции, &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; — пересчёт кластерных центров, &#039;&#039;&#039;&#039;&#039;out&#039;&#039;&#039;&#039;&#039; — вывод полученных данных.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для одной итерации алгоритма в параллельном варианте требуется &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; раз последовательно выполнить для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; операций нахождения расстояния от элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
* &amp;lt;math&amp;gt;C-1&amp;lt;/math&amp;gt; сравнений, для нахождения минимального расстояния.&lt;br /&gt;
* операция записи единички в столбец матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Основным ресурсом алгоритма является вычисление квадрата нормы для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt;. Расчёт значения объектной функции &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; сложно представить в параллельном варианте, поэтому вычисление объектной функции производится последовательно.Использование параллельной реализации алгоритма приведёт к понижению производительности при небольшой размерности системы и малом объеме выборки. При параллельном варианте необходима пересылка данных, что при малом объеме выборки и небольшой размерности займет больше времени, чем при последовательном варианте.&lt;br /&gt;
Как легко видеть из информационного графа, высота [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] составляет &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;, ширина ЯПФ составляет &amp;lt;math&amp;gt;O(cK)&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;
# &amp;lt;math&amp;gt;\{u_k\}_{k=1}^{K}&amp;lt;/math&amp;gt; — исходный набор векторов, принадлежащие пространству &amp;lt;math&amp;gt;\mathbb{R}^n&amp;lt;/math&amp;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; &amp;lt;math&amp;gt;nK&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;M&amp;lt;/math&amp;gt; — матрица, принадлежащая пространству &amp;lt;math&amp;gt;\mathbb{R}^{c \times K}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &amp;lt;math&amp;gt;\{c_i\}_{i=1}^{c}&amp;lt;/math&amp;gt; — набор построенных кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;c(K+n)&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;
&#039;&#039;&#039;Достоинства:&#039;&#039;&#039; легкость реализации,вычислительная простота.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039; задание количества кластеров,отсутствие гарантии в нахождении оптимального решения.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13055</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=13055"/>
		<updated>2016-10-17T22:10:14Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(cK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(nK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(c(K+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;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
&lt;br /&gt;
1.&#039;&#039;&#039;Инициализация: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Случайным образом определяются C векторов - центров кластеров&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;
3. &#039;&#039;&#039;Расчет оценочной функции:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Переопределение кластерных центров&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;X&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;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;v_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;v^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;V_{1}, V_{2}, ... V_{C}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{C} \sum_{x_{i} \in v_{j}}^{} \|x_{i}-v_{j}\|^2,  j \in 1,2, ... C, i={1,2, ...n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;X_{1},X_{2}, ... X_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; v_{1},v_{2},...,v_{C}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,C; \; k = 1,2,\ldots,N)\\&lt;br /&gt;
0, &amp;amp; \text{otherwise}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; v^*_{j} = \frac{1}{|v_{j}|} \sum_{x_{i} \in v_{j}}^{} x_{i}, j=1,2,3..,C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;|v_{j}| &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру &amp;lt;math&amp;gt;v_{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром данного алгоритма является вычисление на каждой итерации алгоритма квадратов норм между кластерными центрами и векторами из входного набор согласно формуле &amp;lt;math&amp;gt;\|u_k-c_i\|^2&amp;lt;/math&amp;gt;. На каждой итерации алгоритма происходит &amp;lt;math&amp;gt;CN&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;&lt;br /&gt;
d_{ki} = \|u_k-c_i\|^2&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При вычислении объектной функции производится суммирование полученных расстояний:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^C J_i = \sum\limits_{i=1}^C \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right),&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При перерасчете кластерных центров происходит суммирование векторов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&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;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c-1)&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt; Pawan Kumar, Mr. Pankaj Verma, Rakesh Shrma. Comparative analysis of Fuzzy C-mean and Hard C-mean algorithm [http://csjournals.com/IJITKM/PDF%203-1/39.pdf]&amp;lt;/ref&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход в &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 1. &#039;&#039;&#039;&#039;&#039;in&#039;&#039;&#039;&#039;&#039; - входные данные, &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - вычисление расстояния до кластерных центров и значение &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; единое для каждой группы &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - нахождение минимального расстояния до кластерных центров, &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - запись единички в столбец матрицы, &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - расчёт объектной функции, &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; — пересчёт кластерных центров, &#039;&#039;&#039;&#039;&#039;out&#039;&#039;&#039;&#039;&#039; — вывод полученных данных.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для одной итерации алгоритма в параллельном варианте требуется &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; раз последовательно выполнить для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; операций нахождения расстояния от элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
* &amp;lt;math&amp;gt;C-1&amp;lt;/math&amp;gt; сравнений, для нахождения минимального расстояния.&lt;br /&gt;
* операция записи единички в столбец матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Основным ресурсом алгоритма является вычисление квадрата нормы для каждого &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt;. Расчёт значения объектной функции &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; сложно представить в параллельном варианте, поэтому вычисление объектной функции производится последовательно.Использование параллельной реализации алгоритма приведёт к понижению производительности при небольшой размерности системы и малом объеме выборки. При параллельном варианте необходима пересылка данных, что при малом объеме выборки и небольшой размерности займет больше времени, чем при последовательном варианте.&lt;br /&gt;
Как легко видеть из информационного графа, высота [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] составляет &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;, ширина ЯПФ составляет &amp;lt;math&amp;gt;O(cK)&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;
# &amp;lt;math&amp;gt;\{u_k\}_{k=1}^{K}&amp;lt;/math&amp;gt; — исходный набор векторов, принадлежащие пространству &amp;lt;math&amp;gt;\mathbb{R}^n&amp;lt;/math&amp;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; &amp;lt;math&amp;gt;nK&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;M&amp;lt;/math&amp;gt; — матрица, принадлежащая пространству &amp;lt;math&amp;gt;\mathbb{R}^{c \times K}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &amp;lt;math&amp;gt;\{c_i\}_{i=1}^{c}&amp;lt;/math&amp;gt; — набор построенных кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;c(K+n)&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;
&#039;&#039;&#039;Достоинства:&#039;&#039;&#039; легкость реализации,вычислительная простота.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039; задание количества кластеров,отсутствие гарантии в нахождении оптимального решения.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12858</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12858"/>
		<updated>2016-10-16T21:07:21Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]], [[Участник:Темербекова_Гульгайша|Гульгайша Темербекова]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
&lt;br /&gt;
1.&#039;&#039;&#039;Инициализация: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Случайным образом определяются C векторов - центров кластеров&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;
3. &#039;&#039;&#039;Расчет оценочной функции:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Переопределение кластерных центров&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;X&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;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;v_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;v^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;V_{1}, V_{2}, ... V_{C}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{C} \sum_{x_{i} \in v_{j}}^{} \|x_{i}-v_{j}\|^2,  j \in 1,2, ... C, i={1,2, ...n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;X_{1},X_{2}, ... X_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; v_{1},v_{2},...,v_{C}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,C; \; k = 1,2,\ldots,N)\\&lt;br /&gt;
0, &amp;amp; \text{otherwise}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; v^*_{j} = \frac{1}{|v_{j}|} \sum_{x_{i} \in v_{j}}^{} x_{i}, j=1,2,3..,C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;|v_{j}| &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру &amp;lt;math&amp;gt;v_{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром данного алгоритма является вычисление на каждой итерации алгоритма квадратов норм между кластерными центрами и векторами из входного набор согласно формуле &amp;lt;math&amp;gt;\|u_k-c_i\|^2&amp;lt;/math&amp;gt;. На каждой итерации алгоритма происходит &amp;lt;math&amp;gt;CN&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;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c+cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{c(c+1)K}{2}&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход в &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 1. &#039;&#039;&#039;&#039;&#039;in&#039;&#039;&#039;&#039;&#039; - входные данные, &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - вычисление расстояния до кластерных центров и значение &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; единое для каждой группы &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров, &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - запись единички в столбец матрицы, &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - расчёт объектной функции, &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; — пересчёт кластерных центров, &#039;&#039;&#039;&#039;&#039;out&#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;
&lt;br /&gt;
&#039;&#039;&#039;Достоинства:&#039;&#039;&#039; легкость реализации,вычислительная простота.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039; задание количества кластеров,отсутствие гарантии в нахождении оптимального решения&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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12856</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12856"/>
		<updated>2016-10-16T21:06:18Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]], [[Участник:Темербекова_Гульгайша|Гульгайша Темербекова]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
&lt;br /&gt;
1. Инициализация: &lt;br /&gt;
Случайным образом определяются C векторов - центров кластеров&lt;br /&gt;
&lt;br /&gt;
2. Расчет рядовой матрицы: &lt;br /&gt;
В процессе расчета рядовой матрицы каждый вектор сравнивается с ближайшим кластерным центром&lt;br /&gt;
&lt;br /&gt;
3. Расчет оценочной функции:&lt;br /&gt;
Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
&lt;br /&gt;
4. Переопределение кластерных центров&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;X&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;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;v_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;v^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;V_{1}, V_{2}, ... V_{C}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{C} \sum_{x_{i} \in v_{j}}^{} \|x_{i}-v_{j}\|^2,  j \in 1,2, ... C, i={1,2, ...n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;X_{1},X_{2}, ... X_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; v_{1},v_{2},...,v_{C}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,C; \; k = 1,2,\ldots,N)\\&lt;br /&gt;
0, &amp;amp; \text{otherwise}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; v^*_{j} = \frac{1}{|v_{j}|} \sum_{x_{i} \in v_{j}}^{} x_{i}, j=1,2,3..,C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;|v_{j}| &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру &amp;lt;math&amp;gt;v_{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром данного алгоритма является вычисление на каждой итерации алгоритма квадратов норм между кластерными центрами и векторами из входного набор согласно формуле &amp;lt;math&amp;gt;\|u_k-c_i\|^2&amp;lt;/math&amp;gt;. На каждой итерации алгоритма происходит &amp;lt;math&amp;gt;CN&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;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c+cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{c(c+1)K}{2}&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход в &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 1. &#039;&#039;&#039;&#039;&#039;in&#039;&#039;&#039;&#039;&#039; - входные данные, &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - вычисление расстояния до кластерных центров и значение &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; единое для каждой группы &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров, &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - запись единички в столбец матрицы, &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - расчёт объектной функции, &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; — пересчёт кластерных центров, &#039;&#039;&#039;&#039;&#039;out&#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;
&lt;br /&gt;
&#039;&#039;&#039;Достоинства:&#039;&#039;&#039; легкость реализации,вычислительная простота.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039; задание количества кластеров,отсутствие гарантии в нахождении оптимального решения&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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12855</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12855"/>
		<updated>2016-10-16T21:05:49Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]], [[Участник:Темербекова_Гульгайша|Гульгайша Темербекова]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
1. Инициализация: &lt;br /&gt;
   Случайным образом определяются C векторов - центров кластеров&lt;br /&gt;
2. Расчет рядовой матрицы: &lt;br /&gt;
    В процессе расчета рядовой матрицы каждый вектор сравнивается с ближайшим кластерным центром&lt;br /&gt;
3. Расчет оценочной функции:&lt;br /&gt;
   Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
4. Переопределение кластерных центров&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;X&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;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;v_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;v^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;V_{1}, V_{2}, ... V_{C}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{C} \sum_{x_{i} \in v_{j}}^{} \|x_{i}-v_{j}\|^2,  j \in 1,2, ... C, i={1,2, ...n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;X_{1},X_{2}, ... X_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; v_{1},v_{2},...,v_{C}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,C; \; k = 1,2,\ldots,N)\\&lt;br /&gt;
0, &amp;amp; \text{otherwise}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; v^*_{j} = \frac{1}{|v_{j}|} \sum_{x_{i} \in v_{j}}^{} x_{i}, j=1,2,3..,C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;|v_{j}| &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру &amp;lt;math&amp;gt;v_{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром данного алгоритма является вычисление на каждой итерации алгоритма квадратов норм между кластерными центрами и векторами из входного набор согласно формуле &amp;lt;math&amp;gt;\|u_k-c_i\|^2&amp;lt;/math&amp;gt;. На каждой итерации алгоритма происходит &amp;lt;math&amp;gt;CN&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;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c+cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{c(c+1)K}{2}&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход в &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 1. &#039;&#039;&#039;&#039;&#039;in&#039;&#039;&#039;&#039;&#039; - входные данные, &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - вычисление расстояния до кластерных центров и значение &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; единое для каждой группы &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров, &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - запись единички в столбец матрицы, &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - расчёт объектной функции, &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; — пересчёт кластерных центров, &#039;&#039;&#039;&#039;&#039;out&#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;
&lt;br /&gt;
&#039;&#039;&#039;Достоинства:&#039;&#039;&#039; легкость реализации,вычислительная простота.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039; задание количества кластеров,отсутствие гарантии в нахождении оптимального решения&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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12854</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12854"/>
		<updated>2016-10-16T21:04:21Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]], [[Участник:Темербекова_Гульгайша|Гульгайша Темербекова]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
1) Инициализация: &lt;br /&gt;
   Случайным образом определяются C векторов - центров кластеров&lt;br /&gt;
2) Расчет рядовой матрицы: &lt;br /&gt;
    В процессе расчета рядовой матрицы каждый вектор сравнивается с ближайшим кластерным центром&lt;br /&gt;
3) Расчет оценочной функции:&lt;br /&gt;
   Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
4) Переопределение кластерных центров&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;X&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;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;v_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;v^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;V_{1}, V_{2}, ... V_{C}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{C} \sum_{x_{i} \in v_{j}}^{} \|x_{i}-v_{j}\|^2,  j \in 1,2, ... C, i={1,2, ...n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;X_{1},X_{2}, ... X_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; v_{1},v_{2},...,v_{C}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,C; \; k = 1,2,\ldots,N)\\&lt;br /&gt;
0, &amp;amp; \text{otherwise}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; v^*_{j} = \frac{1}{|v_{j}|} \sum_{x_{i} \in v_{j}}^{} x_{i}, j=1,2,3..,C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;|v_{j}| &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру &amp;lt;math&amp;gt;v_{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром данного алгоритма является вычисление на каждой итерации алгоритма квадратов норм между кластерными центрами и векторами из входного набор согласно формуле &amp;lt;math&amp;gt;\|u_k-c_i\|^2&amp;lt;/math&amp;gt;. На каждой итерации алгоритма происходит &amp;lt;math&amp;gt;CN&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;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c+cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{c(c+1)K}{2}&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход в &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 1. &#039;&#039;&#039;&#039;&#039;in&#039;&#039;&#039;&#039;&#039; - входные данные, &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - вычисление расстояния до кластерных центров и значение &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; единое для каждой группы &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров, &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - запись единички в столбец матрицы, &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - расчёт объектной функции, &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; — пересчёт кластерных центров, &#039;&#039;&#039;&#039;&#039;out&#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;
&lt;br /&gt;
&#039;&#039;&#039;Достоинства:&#039;&#039;&#039; легкость реализации,вычислительная простота.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039; задание количества кластеров,отсутствие гарантии в нахождении оптимального решения&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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12853</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12853"/>
		<updated>2016-10-16T21:03:31Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Свойства и структура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]], [[Участник:Темербекова_Гульгайша|Гульгайша Темербекова]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
1) Инициализация: &lt;br /&gt;
   Случайным образом определяются C векторов - центров кластеров&lt;br /&gt;
2) Расчет рядовой матрицы: &lt;br /&gt;
    В процессе расчета рядовой матрицы каждый вектор сравнивается с ближайшим кластерным центром&lt;br /&gt;
3) Расчет оценочной функции:&lt;br /&gt;
   Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
4) Переопределение кластерных центров&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;X&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;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;v_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;v^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;V_{1}, V_{2}, ... V_{C}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{C} \sum_{x_{i} \in v_{j}}^{} \|x_{i}-v_{j}\|^2,  j \in 1,2, ... C, i={1,2, ...n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;X_{1},X_{2}, ... X_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; v_{1},v_{2},...,v_{C}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,C; \; k = 1,2,\ldots,N)\\&lt;br /&gt;
0, &amp;amp; \text{otherwise}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; v^*_{j} = \frac{1}{|v_{j}|} \sum_{x_{i} \in v_{j}}^{} x_{i}, j=1,2,3..,C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;v_{j} &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру v_{j}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром данного алгоритма является вычисление на каждой итерации алгоритма квадратов норм между кластерными центрами и векторами из входного набор согласно формуле &amp;lt;math&amp;gt;\|u_k-c_i\|^2&amp;lt;/math&amp;gt;. На каждой итерации алгоритма происходит &amp;lt;math&amp;gt;CN&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;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c+cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{c(c+1)K}{2}&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход в &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 1. &#039;&#039;&#039;&#039;&#039;in&#039;&#039;&#039;&#039;&#039; - входные данные, &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; - вычисление расстояния до кластерных центров и значение &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; единое для каждой группы &#039;&#039;&#039;&#039;&#039;&amp;lt;math&amp;gt;c_1,...,c_c&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров, &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - запись единички в столбец матрицы, &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - расчёт объектной функции, &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; — пересчёт кластерных центров, &#039;&#039;&#039;&#039;&#039;out&#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;
&lt;br /&gt;
&#039;&#039;&#039;Достоинства:&#039;&#039;&#039; легкость реализации,вычислительная простота.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039; задание количества кластеров,отсутствие гарантии в нахождении оптимального решения&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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12850</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12850"/>
		<updated>2016-10-16T21:00:34Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]], [[Участник:Темербекова_Гульгайша|Гульгайша Темербекова]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
1) Инициализация: &lt;br /&gt;
   Случайным образом определяются C векторов - центров кластеров&lt;br /&gt;
2) Расчет рядовой матрицы: &lt;br /&gt;
    В процессе расчета рядовой матрицы каждый вектор сравнивается с ближайшим кластерным центром&lt;br /&gt;
3) Расчет оценочной функции:&lt;br /&gt;
   Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
4) Переопределение кластерных центров&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;X&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;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;v_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;v^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;V_{1}, V_{2}, ... V_{C}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{C} \sum_{x_{i} \in v_{j}}^{} \|x_{i}-v_{j}\|^2,  j \in 1,2, ... C, i={1,2, ...n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;X_{1},X_{2}, ... X_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; v_{1},v_{2},...,v_{C}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,C; \; k = 1,2,\ldots,N)\\&lt;br /&gt;
0, &amp;amp; \text{otherwise}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; v^*_{j} = \frac{1}{|v_{j}|} \sum_{x_{i} \in v_{j}}^{} x_{i}, j=1,2,3..,C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;v_{j} &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру v_{j}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром данного алгоритма является вычисление на каждой итерации алгоритма квадратов норм между кластерными центрами и векторами из входного набор согласно формуле &amp;lt;math&amp;gt;\|u_k-c_i\|^2&amp;lt;/math&amp;gt;. На каждой итерации алгоритма происходит &amp;lt;math&amp;gt;CN&amp;lt;/math&amp;gt; таких вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c+cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{c(c+1)K}{2}&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;c_{1},...,c_{c}&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход в &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 1. &#039;&#039;&#039;&#039;&#039;in&#039;&#039;&#039;&#039;&#039; - входные данные, &#039;&#039;&#039;&#039;&#039;c_{1},...,c_{c}&#039;&#039;&#039;&#039;&#039; - вычисление расстояния до кластерных центров и значение &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; единое для каждой группы &#039;&#039;&#039;&#039;&#039;с_{1},...,c{c}&#039;&#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров, &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - запись единички в столбец матрицы, &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - расчёт объектной функции, &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; — пересчёт кластерных центров, &#039;&#039;&#039;&#039;&#039;out&#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;
&lt;br /&gt;
&#039;&#039;&#039;Достоинства:&#039;&#039;&#039; легкость реализации,вычислительная простота.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039; задание количества кластеров,отсутствие гарантии в нахождении оптимального решения&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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12848</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12848"/>
		<updated>2016-10-16T20:59:07Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]], [[Участник:Темербекова_Гульгайша|Гульгайша Темербекова]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
1) Инициализация: &lt;br /&gt;
   Случайным образом определяются C векторов - центров кластеров&lt;br /&gt;
2) Расчет рядовой матрицы: &lt;br /&gt;
    В процессе расчета рядовой матрицы каждый вектор сравнивается с ближайшим кластерным центром&lt;br /&gt;
3) Расчет оценочной функции:&lt;br /&gt;
   Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
4) Переопределение кластерных центров&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;X&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;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;v_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;v^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;V_{1}, V_{2}, ... V_{C}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{C} \sum_{x_{i} \in v_{j}}^{} \|x_{i}-v_{j}\|^2,  j \in 1,2, ... C, i={1,2, ...n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;X_{1},X_{2}, ... X_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; v_{1},v_{2},...,v_{C}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,C; \; k = 1,2,\ldots,N)\\&lt;br /&gt;
0, &amp;amp; \text{otherwise}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; v^*_{j} = \frac{1}{|v_{j}|} \sum_{x_{i} \in v_{j}}^{} x_{i}, j=1,2,3..,C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;v_{j} &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру v_{j}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром данного алгоритма является вычисление на каждой итерации алгоритма квадратов норм между кластерными центрами и векторами из входного набор согласно формуле&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c+cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{c(c+1)K}{2}&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;c_{1},...,c_{c}&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход в &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 1. &#039;&#039;&#039;&#039;&#039;in&#039;&#039;&#039;&#039;&#039; - входные данные, &#039;&#039;&#039;&#039;&#039;c_{1},...,c_{c}&#039;&#039;&#039;&#039;&#039; - вычисление расстояния до кластерных центров и значение &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; единое для каждой группы &#039;&#039;&#039;&#039;&#039;с_{1},...,c{c}&#039;&#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров, &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - запись единички в столбец матрицы, &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - расчёт объектной функции, &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; — пересчёт кластерных центров, &#039;&#039;&#039;&#039;&#039;out&#039;&#039;&#039;&#039;&#039; — вывод полученных данных.]]&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Назначение: кластеризация больших наборов числовых данных. &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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12836</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12836"/>
		<updated>2016-10-16T20:43:57Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Свойства и структура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]], [[Участник:Темербекова_Гульгайша|Гульгайша Темербекова]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
1) Инициализация: &lt;br /&gt;
   Случайным образом определяются C векторов - центров кластеров&lt;br /&gt;
2) Расчет рядовой матрицы: &lt;br /&gt;
    В процессе расчета рядовой матрицы каждый вектор сравнивается с ближайшим кластерным центром&lt;br /&gt;
3) Расчет оценочной функции:&lt;br /&gt;
   Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
4) Переопределение кластерных центров&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;X&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;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;v_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;v^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;V_{1}, V_{2}, ... V_{C}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{C} \sum_{x_{i} \in v_{j}}^{} \|x_{i}-v_{j}\|^2,  j \in 1,2, ... C, i={1,2, ...n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;X_{1},X_{2}, ... X_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; v_{1},v_{2},...,v_{C}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,C; \; k = 1,2,\ldots,N)\\&lt;br /&gt;
0, &amp;amp; \text{otherwise}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; v^*_{j} = \frac{1}{|v_{j}|} \sum_{x_{i} \in v_{j}}^{} x_{i}, j=1,2,3..,C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;v_{j} &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру v_{j}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c+cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{c(c+1)K}{2}&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;d_{1},...,d_{c}&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12835</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12835"/>
		<updated>2016-10-16T20:42:51Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]], [[Участник:Темербекова_Гульгайша|Гульгайша Темербекова]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
1) Инициализация: &lt;br /&gt;
   Случайным образом определяются C векторов - центров кластеров&lt;br /&gt;
2) Расчет рядовой матрицы: &lt;br /&gt;
    В процессе расчета рядовой матрицы каждый вектор сравнивается с ближайшим кластерным центром&lt;br /&gt;
3) Расчет оценочной функции:&lt;br /&gt;
   Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
4) Переопределение кластерных центров&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;X&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;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;v_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;v^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;V_{1}, V_{2}, ... V_{C}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{C} \sum_{x_{i} \in v_{j}}^{} \|x_{i}-v_{j}\|^2,  j \in 1,2, ... C, i={1,2, ...n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;X_{1},X_{2}, ... X_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; v_{1},v_{2},...,v_{C}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,C; \; k = 1,2,\ldots,N)\\&lt;br /&gt;
0, &amp;amp; \text{otherwise}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; v^*_{j} = \frac{1}{|v_{j}|} \sum_{x_{i} \in v_{j}}^{} x_{i}, j=1,2,3..,C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;v_{j} &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру v_{j}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c+cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{c(c+1)K}{2}&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;d_{1},...,d_{c}&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12834</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12834"/>
		<updated>2016-10-16T20:41:57Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]], [[Участник:Темербекова_Гульгайша|Гульгайша Темербекова]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
1) Инициализация: &lt;br /&gt;
   Случайным образом определяются C векторов - центров кластеров&lt;br /&gt;
2) Расчет рядовой матрицы: &lt;br /&gt;
    В процессе расчета рядовой матрицы каждый вектор сравнивается с ближайшим кластерным центром&lt;br /&gt;
3) Расчет оценочной функции:&lt;br /&gt;
   Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
4) Переопределение кластерных центров&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;X&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;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;v_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;v^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;V_{1}, V_{2}, ... V_{C}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{C} \sum_{x_{i} \in v_{j}}^{} \|x_{i}-v_{j}\|^2,  j \in 1,2, ... C, i={1,2, ...n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;X_{1},X_{2}, ... X_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; v_{1},v_{2},...,v_{C}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,C; \; k = 1,2,\ldots,N)\\&lt;br /&gt;
0, &amp;amp; \text{otherwise}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; v^*_{j} = \frac{1}{|v_{j}|} \sum_{x_{i} \in v_{j}}^{} x_{i}, j=1,2,3..,C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;v_{j} &amp;lt;/math&amp;gt; - число элементов, принадлежащих кластеру v_{j}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 5&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
Если алгоритм не завершил свою работу на шаге 3 то переходим к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c+cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{c(c+1)K}{2}&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;d_{1},...,d_{c}&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12833</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12833"/>
		<updated>2016-10-16T20:38:23Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]], [[Участник:Темербекова_Гульгайша|Гульгайша Темербекова]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
1) Инициализация: &lt;br /&gt;
   Случайным образом определяются C векторов - центров кластеров&lt;br /&gt;
2) Расчет рядовой матрицы: &lt;br /&gt;
    В процессе расчета рядовой матрицы каждый вектор сравнивается с ближайшим кластерным центром&lt;br /&gt;
3) Расчет оценочной функции:&lt;br /&gt;
   Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
4) Переопределение кластерных центров&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;X&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;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;v_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;v^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;V_{1}, V_{2}, ... V_{C}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{C} \sum_{x_{i} \in v_{j}}^{} \|x_{i}-v_{j}\|^2,  j \in 1,2, ... C, i={1,2, ...n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;X_{1},X_{2}, ... X_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; v_{1},v_{2},...,v_{C}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,C; \; k = 1,2,\ldots,N)\\&lt;br /&gt;
0, &amp;amp; \text{otherwise}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; v^*_{j} = \frac{1}{|v_{j}|} \sum_{x_{i} \in v_{j}}^{} x_{i}, j=1,2,3..,C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c+cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{c(c+1)K}{2}&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;d_{1},...,d_{c}&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12832</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12832"/>
		<updated>2016-10-16T20:36:13Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]], [[Участник:Темербекова_Гульгайша|Гульгайша Темербекова]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
1) Инициализация: &lt;br /&gt;
   Случайным образом определяются C векторов - центров кластеров&lt;br /&gt;
2) Расчет рядовой матрицы: &lt;br /&gt;
    В процессе расчета рядовой матрицы каждый вектор сравнивается с ближайшим кластерным центром&lt;br /&gt;
3) Расчет оценочной функции:&lt;br /&gt;
   Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
4) Переопределение кластерных центров&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;X&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;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;v_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;v^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;V_{1}, V_{2}, ... V_{C}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{C} \sum_{x_{i} \in v_{j}}^{} \|x_{i}-v_{j}\|^2,  j \in 1,2, ... C, i={1,2, ...n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;X_{1},X_{2}, ... X_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; v_{1},v_{2},...,v_{C}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,C; \; k = 1,2,\ldots,N)\\&lt;br /&gt;
0, &amp;amp; \text{otherwise}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; v^*_{j} = \frac{1}{|v_{j}|} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c+cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{c(c+1)K}{2}&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из пяти групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;d_{1},...,d_{c}&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12829</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12829"/>
		<updated>2016-10-16T20:35:23Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]], [[Участник:Темербекова_Гульгайша|Гульгайша Темербекова]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
1) Инициализация: &lt;br /&gt;
   Случайным образом определяются C векторов - центров кластеров&lt;br /&gt;
2) Расчет рядовой матрицы: &lt;br /&gt;
    В процессе расчета рядовой матрицы каждый вектор сравнивается с ближайшим кластерным центром&lt;br /&gt;
3) Расчет оценочной функции:&lt;br /&gt;
   Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
4) Переопределение кластерных центров&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;X&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;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;v_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;v^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;V_{1}, V_{2}, ... V_{C}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{C} \sum_{x_{i} \in v_{j}}^{} \|x_{i}-v_{j}\|^2,  j \in 1,2, ... C, i={1,2, ...n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;X_{1},X_{2}, ... X_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; v_{1},v_{2},...,v_{C}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,C; \; k = 1,2,\ldots,N)\\&lt;br /&gt;
0, &amp;amp; \text{otherwise}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; v^*_{j} = \frac{1}{v_{j}} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c+cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{c(c+1)K}{2}&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
опишем граф как аналитически, так и в виде рисунка. &lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из шести групп вершин.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;d_{1},...,d_{c}&#039;&#039;&#039;&#039;&#039; - прямое вычисление расстояния до кластерных центров, то есть вычисление расстояний от заданного элемента &amp;lt;math&amp;gt;u_i&amp;lt;/math&amp;gt; до каждого из кластерных центров.&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;min&#039;&#039;&#039;&#039;&#039; - ей соответствует вычисление минимального расстояния до кластерных центров,передача найденного минимального расстояния и соответствующего ему индекса кластера.&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;M&#039;&#039;&#039;&#039;&#039; - ей соответствует операция записи единички в столбец матрицы.&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039; - вычисление объектной функции, происходит проверка условия достижения необходимой точности, если достигли заданной точности то переход &#039;&#039;&#039;&#039;&#039;Out&#039;&#039;&#039;&#039;&#039;, в противном случае &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа вершин &#039;&#039;&#039;&#039;&#039;Conversion&#039;&#039;&#039;&#039;&#039; - пересчёт кластерных центров и переход на следующую итерацию.&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена одна итерация алгоритма.&lt;br /&gt;
 &lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12826</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12826"/>
		<updated>2016-10-16T20:32:52Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]], [[Участник:Темербекова_Гульгайша|Гульгайша Темербекова]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
1) Инициализация: &lt;br /&gt;
   Случайным образом определяются C векторов - центров кластеров&lt;br /&gt;
2) Расчет рядовой матрицы: &lt;br /&gt;
    В процессе расчета рядовой матрицы каждый вектор сравнивается с ближайшим кластерным центром&lt;br /&gt;
3) Расчет оценочной функции:&lt;br /&gt;
   Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
4) Переопределение кластерных центров&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;X&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;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;v_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;v^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;V_{1}, V_{2}, ... V_{C}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{C} \sum_{x_{i} \in v_{j}}^{} \|x_{i}-v_{j}\|^2,  j \in 1,2, ... C, i={1,2, ...n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;X_{1},X_{2}, ... X_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; v_{1},v_{2},...,v_{C}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,C; \; k = 1,2,\ldots,N)\\&lt;br /&gt;
0, &amp;amp; \text{otherwise}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 3&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитывается объектная функция J. На этом этапе может быть инициировано завершение алгоритма в случае если значение объектной функции незначительно изменилось относительно предыдущей итерации или достигло ожидаемого значения. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 4&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Рассчитываются новые кластерные центры по следующей формуле: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; v^*_{j} = \frac{1}{|v_{j}}&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c+cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{c(c+1)K}{2}&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[File:Picture.png|thumb|600px|center|Рисунок 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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12804</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12804"/>
		<updated>2016-10-16T20:07:12Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]], [[Участник:Темербекова_Гульгайша|Гульгайша Темербекова]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
1) Инициализация: &lt;br /&gt;
   Случайным образом определяются C векторов - центров кластеров&lt;br /&gt;
2) Расчет рядовой матрицы: &lt;br /&gt;
    В процессе расчета рядовой матрицы каждый вектор сравнивается с ближайшим кластерным центром&lt;br /&gt;
3) Расчет оценочной функции:&lt;br /&gt;
   Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
4) Переопределение кластерных центров&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;X&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;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;v_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;v^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;V_{1}, V_{2}, ... V_{C}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{C} \sum_{x_{i} \in v_{j}}^{} \|x_{i}-v_{j}\|^2,  j \in 1,2, ... C, i={1,2, ...n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;X_{1},X_{2}, ... X_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; v_{1},v_{2},...,v_{C}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,C; \; k = 1,2,\ldots,N)\\&lt;br /&gt;
0, &amp;amp; \text{otherwise}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c+cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{c(c+1)K}{2}&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12803</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12803"/>
		<updated>2016-10-16T20:06:38Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]], [[Участник:Темербекова_Гульгайша|Гульгайша Темербекова]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
1) Инициализация: &lt;br /&gt;
   Случайным образом определяются C векторов - центров кластеров&lt;br /&gt;
2) Расчет рядовой матрицы: &lt;br /&gt;
    В процессе расчета рядовой матрицы каждый вектор сравнивается с ближайшим кластерным центром&lt;br /&gt;
3) Расчет оценочной функции:&lt;br /&gt;
   Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
4) Переопределение кластерных центров&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;X&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;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;v_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;v^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;V_{1}, V_{2}, ... V_{C}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{C} \sum_{x_{i} \in v_{j}}^{} \|x_{i}-v_{j}\|^2,  j \in 1,2, ... C, i={1,2, ...n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;X_{1},X_{2}, ... X_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;C&amp;lt;math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; v_{1},v_{2},...,v_{C}&amp;lt;/math&amp;gt;либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,C; \; k = 1,2,\ldots,N)\\&lt;br /&gt;
0, &amp;amp; \text{otherwise}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c+cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{c(c+1)K}{2}&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12802</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12802"/>
		<updated>2016-10-16T20:05:43Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]], [[Участник:Темербекова_Гульгайша|Гульгайша Темербекова]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
1) Инициализация: &lt;br /&gt;
   Случайным образом определяются C векторов - центров кластеров&lt;br /&gt;
2) Расчет рядовой матрицы: &lt;br /&gt;
    В процессе расчета рядовой матрицы каждый вектор сравнивается с ближайшим кластерным центром&lt;br /&gt;
3) Расчет оценочной функции:&lt;br /&gt;
   Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
4) Переопределение кластерных центров&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;X&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;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;v_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;v^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;V_{1}, V_{2}, ... V_{C}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{C} \sum_{x_{i} \in v_{j}}^{} \|x_{i}-v_{j}\|^2,  j \in 1,2, ... C, i={1,2, ...n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 1&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
Из входного набора &amp;lt;math&amp;gt;X_{1},X_{2}, ... X_{n}&amp;lt;/math&amp;gt; выбираются &amp;lt;math&amp;gt;C&amp;lt;math&amp;gt; начальных кластерных центра &amp;lt;math&amp;gt; v_{1},v_{2},...,v_{C}либо случайным образом, либо с использованием заранее определенного алгоритма&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Шаг 2&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
Рассчитывается рядовая матрица &amp;lt;math&amp;gt; M=\|m_{ik}\|&amp;lt;/math&amp;gt; каждый элемент которой вычисляется по следующей формуле: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,C; \; k = 1,2,\ldots,N)\\&lt;br /&gt;
0, &amp;amp; \text{otherwise}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c+cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{c(c+1)K}{2}&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12738</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12738"/>
		<updated>2016-10-16T18:54:36Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]], [[Участник:Темербекова_Гульгайша|Гульгайша Темербекова]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
1) Инициализация: &lt;br /&gt;
   Случайным образом определяются C векторов - центров кластеров&lt;br /&gt;
2) Расчет рядовой матрицы: &lt;br /&gt;
    В процессе расчета рядовой матрицы каждый вектор сравнивается с ближайшим кластерным центром&lt;br /&gt;
3) Расчет оценочной функции:&lt;br /&gt;
   Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
4) Переопределение кластерных центров&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;X&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;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;v_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;v^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;V_{1}, V_{2}, ... V_{C}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{C} \sum_{x_{i} \in v_{j}}^{} \|x_{i}-v_{j}\|^2,  j \in 1,2, ... C, i={1,2, ...n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c+cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{c(c+1)K}{2}&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12737</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12737"/>
		<updated>2016-10-16T18:54:05Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]], [[Участник:Темербекова_Гульгайша|Гульгайша Темербекова]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
1) Инициализация: &lt;br /&gt;
   Случайным образом определяются C векторов - центров кластеров&lt;br /&gt;
2) Расчет рядовой матрицы: &lt;br /&gt;
    В процессе расчета рядовой матрицы каждый вектор сравнивается с ближайшим кластерным центром&lt;br /&gt;
3) Расчет оценочной функции:&lt;br /&gt;
   Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
4) Переопределение кластерных центров&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;X&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;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;v_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;v^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;V_{1}, V_{2}, ... V_{C}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{C} \sum_{x_{i} \in v_{j}}^{} \|x_{i}-v_{j}\|^2,  j \in 1,2, ... n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c+cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{c(c+1)K}{2}&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12736</id>
		<title>Участник:Шишков Илья Сергеевич/Алгоритм HCM (Hard C – Means)</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%A8%D0%B8%D1%88%D0%BA%D0%BE%D0%B2_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2%D0%B8%D1%87/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_HCM_(Hard_C_%E2%80%93_Means)&amp;diff=12736"/>
		<updated>2016-10-16T18:53:52Z</updated>

		<summary type="html">&lt;p&gt;Шишков Илья Сергеевич: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]], [[Участник:Темербекова_Гульгайша|Гульгайша Темербекова]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM (Строгий алгоритм С-средних) был предложен группой исследователей(Jang, Sun and Mizutani) в 1997 и относится к классу алгоритмов со строгой кластеризаций. &lt;br /&gt;
&lt;br /&gt;
Кластеризацией называется подход к описанию данных, в котором наиболее схожие данные объединяются в группы(кластеры). Кластеризация является распространенным подходом для анализа данных и используется во многих сферах научной деятельности, таких как машинное обучение, анализ данных, распознавание шаблонов, анализ изображений и биоинформатика.&lt;br /&gt;
&lt;br /&gt;
Кластеризация представляет собой комбинирование рассматриваемых объектов так, чтобы каждая группа объектов обладала схожим свойством. В общем случае кластеризация характеризуются следующими критериями:&lt;br /&gt;
- Каждая группа или кластер однородны; объекты, принадлежащие одной группе имеют схожие свойства;&lt;br /&gt;
- Каждая группа или кластер отличаются от других кластеров т.е. объекты, принадлежащие одному кластеру, должны отличатся от объектов других кластеров&lt;br /&gt;
&lt;br /&gt;
В строгой кластеризации наборы данных разделяются на кластеры однозначно. Каждый набор данных может относится только к одному кластеру. &lt;br /&gt;
Строгой кластеризации характеризуется следующими свойствами:&lt;br /&gt;
- Используется для классификации данных в однозначные наборы&lt;br /&gt;
- Каждый набор данных принадлежит только одному кластеру&lt;br /&gt;
- Кластеры также называют разделами&lt;br /&gt;
- Результатом работы кластерного алгоритма является матрица соответствия которая показывает, к какому кластеру принадлежит каждый набор данных&lt;br /&gt;
&lt;br /&gt;
В этом кластерном алгоритме не допускается частичное отношение к кластеру (как в FCM). HCM предназначен для классификации входных наборов в строгом смысле. В строгом алгоритме С-средних данные классифицируются по кластерам однозначно, т.е. при определенном заранее критерии, каждый элемент данных может принадлежать одному и только одному кластеру. &lt;br /&gt;
&lt;br /&gt;
Алгоритм HCM является итеративным и состоит из нескольких шагов: &lt;br /&gt;
1) Инициализация: &lt;br /&gt;
   Случайным образом определяются C векторов - центров кластеров&lt;br /&gt;
2) Расчет рядовой матрицы: &lt;br /&gt;
    В процессе расчета рядовой матрицы каждый вектор сравнивается с ближайшим кластерным центром&lt;br /&gt;
3) Расчет оценочной функции:&lt;br /&gt;
   Проверка условия, при котором алгоритм завершает работу и вывод результата в этом случае&lt;br /&gt;
4) Переопределение кластерных центров&lt;br /&gt;
&lt;br /&gt;
Пункты 2-4 выполняются до тех пор, пока в пункте 3 проверка не станет успешной.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Обозначения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - наборы данных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;X_{i}&amp;lt;/math&amp;gt; - i-ый набор из &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - любой набор из &amp;lt;math&amp;gt;X&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;X&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_{j}&amp;lt;/math&amp;gt; - j-ый кластер&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;v_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;v^*_{j}&amp;lt;/math&amp;gt; - j-ый кластерный центр после обновления&lt;br /&gt;
&lt;br /&gt;
Выходные данные: &lt;br /&gt;
&amp;lt;math&amp;gt;V_{1}, V_{2}, ... V_{C}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объектная функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;J=\sum_{j = 1}^{C} \sum_{x_{i} \in v_{j}}^{} \|x_{i}-v_{j}\|^2 j \in 1,2, ... n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
1. Инициализация кластерных центров &amp;lt;math&amp;gt;c_i \, (i=1,2,\ldots,c)&amp;lt;/math&amp;gt;. Это можно сделать выбрав случайным образом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; – векторов из входного набора. &lt;br /&gt;
&lt;br /&gt;
2. Вычисление рядовой матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
m_{ik} = \begin{cases}&lt;br /&gt;
1, &amp;amp; \|u_k-c_i\|^2 \leqslant \|u_k-c_j\|^2 \;\; \text{for all } i \neq j; \;\; (i,j=1,2,\ldots,c; \; k = 1,2,\ldots,K) \\&lt;br /&gt;
0, &amp;amp; \text{other}.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где К – количество элементов во входном наборе данных. &lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; обладает следующими свойствами:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\sum\limits_{i=1}^c m_{ij} = 1, \;\; \sum\limits_{j=1}^K m_{ij} = K.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Расчёт объектной функции:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \sum\limits_{i=1}^c J_i = \sum\limits_{i=1}^c \left( \sum\limits_{k:\, u_k \in C_i} \|u_k -c_i \|^2 \right)&lt;br /&gt;
.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На этом шаге происходит остановка и выход из цикла, если полученное значение ниже пороговой величины или полученное значение не сильно отличается от значений, полученных на предыдущих циклах.&lt;br /&gt;
&lt;br /&gt;
4. Пересчёт кластерных центров выполняется в соответствии со следующим уравнением:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_i = \frac{1}{|C_i|} \sum\limits_{k:\, u_k \in C_i} u_k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где под &amp;lt;math&amp;gt;|C_i|&amp;lt;/math&amp;gt; подразумевается количество элементов в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом кластере.&lt;br /&gt;
&lt;br /&gt;
5. на шаг 2.&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;n-1&amp;lt;/math&amp;gt; сложений  и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций возведения в квадрат (умножений).&lt;br /&gt;
&lt;br /&gt;
Для каждой итерации алгоритма требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;ncK&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;K(c+cn+1)&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{c(c+1)K}{2}&amp;lt;/math&amp;gt; сравнений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения (вычитания), сравнения составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Итоговая сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(ncK)&amp;lt;/math&amp;gt;. Обычно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значительно меньше, чем &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Шишков Илья Сергеевич</name></author>
	</entry>
</feed>