<?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%A2%D0%B5%D0%BC%D0%B5%D1%80%D0%B1%D0%B5%D0%BA%D0%BE%D0%B2%D0%B0+%D0%93%D1%83%D0%BB%D1%8C%D0%B3%D0%B0%D0%B9%D1%88%D0%B0</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%A2%D0%B5%D0%BC%D0%B5%D1%80%D0%B1%D0%B5%D0%BA%D0%BE%D0%B2%D0%B0+%D0%93%D1%83%D0%BB%D1%8C%D0%B3%D0%B0%D0%B9%D1%88%D0%B0"/>
	<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%A2%D0%B5%D0%BC%D0%B5%D1%80%D0%B1%D0%B5%D0%BA%D0%BE%D0%B2%D0%B0_%D0%93%D1%83%D0%BB%D1%8C%D0%B3%D0%B0%D0%B9%D1%88%D0%B0"/>
	<updated>2026-10-23T17:11:43Z</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=21412</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=21412"/>
		<updated>2016-12-19T15:56:13Z</updated>

		<summary type="html">&lt;p&gt;Темербекова Гульгайша: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Coctic}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(IncK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(I(log_2(K) + log_2(c)))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(ncK)&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; операций возведения в квадрат (умножений), где &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(IncK)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&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;
&lt;br /&gt;
Если мы разделим объектную функцию &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; независимых процессов, то высота ЯПФ будет составлять &amp;lt;math&amp;gt;O(I(log_2(K) + log_2(c)))&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; -число итераций, &amp;lt;math&amp;gt;log_2(K)&amp;lt;/math&amp;gt; - число операций для суммирования &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; элементов для расчёта &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;log_2(c)&amp;lt;/math&amp;gt; - число операций для нахождение минимального расстояния до кластерных центров. Ширина ЯПФ составляет &amp;lt;math&amp;gt;O(ncK)&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;
&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=21411</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=21411"/>
		<updated>2016-12-19T15:55:18Z</updated>

		<summary type="html">&lt;p&gt;Темербекова Гульгайша: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Coctic}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм HCM (Hard C – Means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(IncK)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(I(log_2(K) + log_2(c)))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(ncK)&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; операций возведения в квадрат (умножений), где &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(IncK)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&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;
&lt;br /&gt;
Если мы разделим объектную функцию &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; независимых процессов, то высота ЯПФ будет составлять &amp;lt;math&amp;gt;O(I(log_2(K) + log_2(c)))&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; -число итераций, &amp;lt;math&amp;gt;log_2(K)&amp;lt;/math&amp;gt; - число операций для суммирования &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; элементов для расчёта &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, log_2(c) - число операций для нахождение минимального расстояния до кластерных центров. Ширина ЯПФ составляет &amp;lt;math&amp;gt;O(ncK)&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;
&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=21410</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=21410"/>
		<updated>2016-12-19T15:54:55Z</updated>

		<summary type="html">&lt;p&gt;Темербекова Гульгайша: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Coctic}}&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(I(log_2(K) + log_2(c)))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(ncK)&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; операций возведения в квадрат (умножений), где &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(IncK)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&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;
&lt;br /&gt;
Если мы разделим объектную функцию &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; независимых процессов, то высота ЯПФ будет составлять &amp;lt;math&amp;gt;O(I(log_2(K) + log_2(c)))&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; -число итераций, &amp;lt;math&amp;gt;log_2(K)&amp;lt;/math&amp;gt; - число операций для суммирования &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; элементов для расчёта &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, log_2(c) - число операций для нахождение минимального расстояния до кластерных центров. Ширина ЯПФ составляет &amp;lt;math&amp;gt;O(ncK)&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;
&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=21409</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=21409"/>
		<updated>2016-12-19T15:52:08Z</updated>

		<summary type="html">&lt;p&gt;Темербекова Гульгайша: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Coctic}}&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(I(log_2(K) + log_2(c)))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(ncK)&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; операций возведения в квадрат (умножений), где &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;
&lt;br /&gt;
Если мы разделим объектную функцию &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; независимых процессов, то высота ЯПФ будет составлять &amp;lt;math&amp;gt;O(I(log_2(K) + log_2(c)))&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; -число итераций, &amp;lt;math&amp;gt;log_2(K)&amp;lt;/math&amp;gt; - число операций для суммирования &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; элементов для расчёта &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, log_2(c) - число операций для нахождение минимального расстояния до кластерных центров. Ширина ЯПФ составляет &amp;lt;math&amp;gt;O(ncK)&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;
&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=21408</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=21408"/>
		<updated>2016-12-19T15:51:27Z</updated>

		<summary type="html">&lt;p&gt;Темербекова Гульгайша: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Coctic}}&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;&amp;lt;math&amp;gt;O(I(log_2(K) + log_2(c)))&amp;lt;/math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(ncK)&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; операций возведения в квадрат (умножений), где &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;
&lt;br /&gt;
Если мы разделим объектную функцию &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; независимых процессов, то высота ЯПФ будет составлять &amp;lt;math&amp;gt;O(I(log_2(K) + log_2(c)))&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; -число итераций, &amp;lt;math&amp;gt;log_2(K)&amp;lt;/math&amp;gt; - число операций для суммирования &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; элементов для расчёта &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, log_2(c) - число операций для нахождение минимального расстояния до кластерных центров. Ширина ЯПФ составляет &amp;lt;math&amp;gt;O(ncK)&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;
&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=21407</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=21407"/>
		<updated>2016-12-19T15:50:09Z</updated>

		<summary type="html">&lt;p&gt;Темербекова Гульгайша: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Coctic}}&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(K)&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; операций возведения в квадрат (умножений), где &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;
&lt;br /&gt;
Если мы разделим объектную функцию &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; независимых процессов, то высота ЯПФ будет составлять &amp;lt;math&amp;gt;O(I(log_2(K) + log_2(c)))&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; -число итераций, &amp;lt;math&amp;gt;log_2(K)&amp;lt;/math&amp;gt; - число операций для суммирования &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; элементов для расчёта &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, log_2(c) - число операций для нахождение минимального расстояния до кластерных центров. Ширина ЯПФ составляет &amp;lt;math&amp;gt;O(ncK)&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;
&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=21406</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=21406"/>
		<updated>2016-12-19T15:49:16Z</updated>

		<summary type="html">&lt;p&gt;Темербекова Гульгайша: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Coctic}}&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(K)&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; операций возведения в квадрат (умножений), где &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;
&lt;br /&gt;
Если мы разделим объектную функцию &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; независимых процессов, то высота ЯПФ будет составлять &amp;lt;math&amp;gt;I(log_2(K) + log_2(c))&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; -число итераций, &amp;lt;math&amp;gt;log_2(K)&amp;lt;/math&amp;gt; - число операций для суммирования &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; элементов для расчёта &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, log_2(c) - число операций для нахождение минимального расстояния до кластерных центров. Ширина ЯПФ составляет &amp;lt;math&amp;gt;O(ncK)&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;
&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=21386</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=21386"/>
		<updated>2016-12-19T14:36:23Z</updated>

		<summary type="html">&lt;p&gt;Темербекова Гульгайша: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Coctic}}&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(K)&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; операций возведения в квадрат (умножений), где &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(K)&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=21213</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=21213"/>
		<updated>2016-12-18T16:04:30Z</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; операций возведения в квадрат (умножений), где &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(K)&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=21211</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=21211"/>
		<updated>2016-12-18T16:00:06Z</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(K)&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=21007</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=21007"/>
		<updated>2016-12-15T23:50:02Z</updated>

		<summary type="html">&lt;p&gt;Темербекова Гульгайша: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&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=21006</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=21006"/>
		<updated>2016-12-15T23:47:28Z</updated>

		<summary type="html">&lt;p&gt;Темербекова Гульгайша: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assingnent}}&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=21005</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=21005"/>
		<updated>2016-12-15T23:37:39Z</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;
Проведём исследование масштабируемости параллельной реализации алгоритма 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 opemmpi/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=21004</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=21004"/>
		<updated>2016-12-15T23:37: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(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;
Проведём исследование масштабируемости параллельной реализации алгоритма 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 opemmpi/1.8.4-icc.&lt;br /&gt;
Модель используемого CPU - Intel Xeon X5570 2.93GHz.&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=21003</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=21003"/>
		<updated>2016-12-15T23:22:17Z</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;
Проведём исследование масштабируемости параллельной реализации алгоритма 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;
&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=20999</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=20999"/>
		<updated>2016-12-15T17:10:03Z</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;
Проведём исследование масштабируемости параллельной реализации алгоритма 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;
&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=20998</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=20998"/>
		<updated>2016-12-15T17:09: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(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;
Проведём исследование масштабируемости параллельной реализации алгоритма 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;
&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;
[[Файл: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=20997</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=20997"/>
		<updated>2016-12-15T17:08:00Z</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;
Проведём исследование масштабируемости параллельной реализации алгоритма 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;
&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;
[[Файл: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=20777</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=20777"/>
		<updated>2016-12-12T17:49:31Z</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;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]] (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;
Проведём исследование масштабируемости параллельной реализации алгоритма Hard C - Means (HCM). Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета] с пиковой производительностью 1,7 Пфлопс, число процессоров/ядер x86: 12 346 / 52 168. Программа написана на языке C с использованием [http://hpc.cmc.msu.ru/bgp/development/parallel MPI], не использовалось дополнительных опций. Использовалась следующая [https://github.com/cNikolaou/mpi-kmeans параллельная реализация алгоритма HCM].&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;
[[Файл: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=20776</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=20776"/>
		<updated>2016-12-12T17:49:02Z</updated>

		<summary type="html">&lt;p&gt;Темербекова Гульгайша: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignent}}&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;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]] (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;
Проведём исследование масштабируемости параллельной реализации алгоритма Hard C - Means (HCM). Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета] с пиковой производительностью 1,7 Пфлопс, число процессоров/ядер x86: 12 346 / 52 168. Программа написана на языке C с использованием [http://hpc.cmc.msu.ru/bgp/development/parallel MPI], не использовалось дополнительных опций. Использовалась следующая [https://github.com/cNikolaou/mpi-kmeans параллельная реализация алгоритма HCM].&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;
[[Файл: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=20775</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=20775"/>
		<updated>2016-12-12T17:47:04Z</updated>

		<summary type="html">&lt;p&gt;Темербекова Гульгайша: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{Assignent}&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;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]] (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;
Проведём исследование масштабируемости параллельной реализации алгоритма Hard C - Means (HCM). Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета] с пиковой производительностью 1,7 Пфлопс, число процессоров/ядер x86: 12 346 / 52 168. Программа написана на языке C с использованием [http://hpc.cmc.msu.ru/bgp/development/parallel MPI], не использовалось дополнительных опций. Использовалась следующая [https://github.com/cNikolaou/mpi-kmeans параллельная реализация алгоритма HCM].&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;
[[Файл: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=20774</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=20774"/>
		<updated>2016-12-12T17:45: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(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;
Проведём исследование масштабируемости параллельной реализации алгоритма Hard C - Means (HCM). Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета] с пиковой производительностью 1,7 Пфлопс, число процессоров/ядер x86: 12 346 / 52 168. Программа написана на языке C с использованием [http://hpc.cmc.msu.ru/bgp/development/parallel MPI], не использовалось дополнительных опций. Использовалась следующая [https://github.com/cNikolaou/mpi-kmeans параллельная реализация алгоритма HCM].&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;
[[Файл: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=20773</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=20773"/>
		<updated>2016-12-12T17:40:40Z</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;
Проведём исследование масштабируемости параллельной реализации алгоритма Hard C - Means (HCM). Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета] с пиковой производительностью 1,7 Пфлопс, число процессоров/ядер x86: 12 346 / 52 168. Программа написана на языке C с использованием [http://hpc.cmc.msu.ru/bgp/development/parallel MPI], не использовалось дополнительных опций. Использовалась следующая [https://github.com/cNikolaou/mpi-kmeans параллельная реализация алгоритма HCM].&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;
[[Файл: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=20772</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=20772"/>
		<updated>2016-12-12T17:36: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(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;
Проведём исследование масштабируемости параллельной реализации строгого алгоритма C средних (HCM). Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета] с пиковой производительностью 1,7 Пфлопс, число процессоров/ядер x86: 12 346 / 52 168. Программа написана на языке C с использованием [http://hpc.cmc.msu.ru/bgp/development/parallel MPI], не использовалось дополнительных опций. Использовалась следующая [https://github.com/cNikolaou/mpi-kmeans параллельная реализация алгоритма HCM].&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;
На следующем рисунке приведен график [[Глоссарий#Производительность|производительности]] выбранной реализации строгого алгоритма C средних (HCM). &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=20771</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=20771"/>
		<updated>2016-12-12T17:24: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;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]] (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;
Проведём исследование масштабируемости параллельной реализации строгого алгоритма C средних (HCM). Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета] с пиковой производительностью 1,7 Пфлопс, число процессоров/ядер x86: 12 346 / 52 168. Программа написана на языке C с использованием [http://hpc.cmc.msu.ru/bgp/development/parallel MPI], не использовалось дополнительных опций.&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;
На следующем рисунке приведен график [[Глоссарий#Производительность|производительности]] выбранной реализации строгого алгоритма C средних (HCM). &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=20770</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=20770"/>
		<updated>2016-12-12T17:22:35Z</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;
Проведём исследование масштабируемости параллельной реализации строгого алгоритма C средних (HCM). Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; с пиковой производительностью 1,7 Пфлопс, число процессоров/ядер x86: 12 346 / 52 168 [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Программа написана на языке C с использованием [http://hpc.cmc.msu.ru/bgp/development/parallel MPI], не использовалось дополнительных опций.&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;
На следующем рисунке приведен график [[Глоссарий#Производительность|производительности]] выбранной реализации строгого алгоритма C средних (HCM). &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%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:%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&amp;diff=15365</id>
		<title>Обсуждение участника:Шишков Илья Сергеевич</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:%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&amp;diff=15365"/>
		<updated>2016-10-31T20:47:01Z</updated>

		<summary type="html">&lt;p&gt;Темербекова Гульгайша: /* Статья Алгоритм HCM (Hard C – Means) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Статья [[Алгоритм HCM (Hard C – Means)]] =&lt;br /&gt;
* Не указан вклад каждого автора [[Участник:Coctic|Coctic]] ([[Обсуждение участника:Coctic|обсуждение]]) 10:47, 25 октября 2016 (MSK)&lt;br /&gt;
* п. 1.1 Стоит добавит ссылку на публикацию, в которой алгоритм был впервые описан (Jang, Sun and Mizutani) [[Участник:Coctic|Coctic]] ([[Обсуждение участника:Coctic|обсуждение]]) 10:47, 25 октября 2016 (MSK)&lt;br /&gt;
* п. 1.3 Сказано, что &amp;quot;На каждой итерации алгоритма происходит &amp;lt;math&amp;gt;CN&amp;lt;/math&amp;gt; таких вычислений&amp;quot;, однако определений C и N не приведено ни здесь, ни ранее. Ранее имеется определение для c (c малого), но это другой символ. [[Участник:Coctic|Coctic]] ([[Обсуждение участника:Coctic|обсуждение]]) 10:47, 25 октября 2016 (MSK)&lt;br /&gt;
* Ссылки в списке литературы не содержат данных публикации, кроме названия и списка авторов. Веб-ссылки на какую-то версию публикации недостаточно. [[Участник:Coctic|Coctic]] ([[Обсуждение участника:Coctic|обсуждение]]) 10:52, 25 октября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
** Замечания были приняты и исправлены огрехи. [[Участник:Темербекова_Гульгайша|Темербекова_Гульгайша]] ([[Обсуждение участника:Темербекова_Гульгайша|обсуждение]]) 23:40, 31 октября 2016 (MSK)&lt;/div&gt;</summary>
		<author><name>Темербекова Гульгайша</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:%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&amp;diff=15363</id>
		<title>Обсуждение участника:Шишков Илья Сергеевич</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:%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&amp;diff=15363"/>
		<updated>2016-10-31T20:40:48Z</updated>

		<summary type="html">&lt;p&gt;Темербекова Гульгайша: /* Статья Алгоритм HCM (Hard C – Means) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Статья [[Алгоритм HCM (Hard C – Means)]] =&lt;br /&gt;
* Не указан вклад каждого автора [[Участник:Coctic|Coctic]] ([[Обсуждение участника:Coctic|обсуждение]]) 10:47, 25 октября 2016 (MSK)&lt;br /&gt;
* п. 1.1 Стоит добавит ссылку на публикацию, в которой алгоритм был впервые описан (Jang, Sun and Mizutani) [[Участник:Coctic|Coctic]] ([[Обсуждение участника:Coctic|обсуждение]]) 10:47, 25 октября 2016 (MSK)&lt;br /&gt;
* п. 1.3 Сказано, что &amp;quot;На каждой итерации алгоритма происходит &amp;lt;math&amp;gt;CN&amp;lt;/math&amp;gt; таких вычислений&amp;quot;, однако определений C и N не приведено ни здесь, ни ранее. Ранее имеется определение для c (c малого), но это другой символ. [[Участник:Coctic|Coctic]] ([[Обсуждение участника:Coctic|обсуждение]]) 10:47, 25 октября 2016 (MSK)&lt;br /&gt;
* Ссылки в списке литературы не содержат данных публикации, кроме названия и списка авторов. Веб-ссылки на какую-то версию публикации недостаточно. [[Участник:Coctic|Coctic]] ([[Обсуждение участника:Coctic|обсуждение]]) 10:52, 25 октября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Замечания были приняты и исправлены огрехи. [[Участник:Темербекова_Гульгайша|Темербекова_Гульгайша]] ([[Обсуждение участника:Темербекова_Гульгайша|обсуждение]]) 23:40, 31 октября 2016 (MSK)&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=15353</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=15353"/>
		<updated>2016-10-31T20:30:03Z</updated>

		<summary type="html">&lt;p&gt;Темербекова Гульгайша: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&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), [[Участник:Темербекова_Гульгайша|Гульгайша Темербекова]] (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;
=== Динамические характеристики и эффективность реализации алгоритма ===&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=15352</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=15352"/>
		<updated>2016-10-31T20:29:24Z</updated>

		<summary type="html">&lt;p&gt;Темербекова Гульгайша: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]] (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;
=== Динамические характеристики и эффективность реализации алгоритма ===&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=15350</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=15350"/>
		<updated>2016-10-31T20:28:43Z</updated>

		<summary type="html">&lt;p&gt;Темербекова Гульгайша: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]] (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;
=== Динамические характеристики и эффективность реализации алгоритма ===&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=15349</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=15349"/>
		<updated>2016-10-31T20:27:25Z</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;&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), [[Участник:Темербекова_Гульгайша|Гульгайша Темербекова]] (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, Volume 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;
=== Динамические характеристики и эффективность реализации алгоритма ===&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=15336</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=15336"/>
		<updated>2016-10-31T20:17:05Z</updated>

		<summary type="html">&lt;p&gt;Темербекова Гульгайша: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]] (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. 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, Volume 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;
=== Динамические характеристики и эффективность реализации алгоритма ===&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=15331</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=15331"/>
		<updated>2016-10-31T20:08:57Z</updated>

		<summary type="html">&lt;p&gt;Темербекова Гульгайша: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]] (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. 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; Нейский И.М. Классификация и сравнение методов кластеризации[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, Volume 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;
=== Динамические характеристики и эффективность реализации алгоритма ===&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=15324</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=15324"/>
		<updated>2016-10-31T20:04:27Z</updated>

		<summary type="html">&lt;p&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] */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]] (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. 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; Нейский И.М. Классификация и сравнение методов кластеризации[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=15276</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=15276"/>
		<updated>2016-10-31T19:28:27Z</updated>

		<summary type="html">&lt;p&gt;Темербекова Гульгайша: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]] (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 [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; Нейский И.М. Классификация и сравнение методов кластеризации[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=15269</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=15269"/>
		<updated>2016-10-31T19:24:51Z</updated>

		<summary type="html">&lt;p&gt;Темербекова Гульгайша: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Основные авторы описания: [[Участник:Шишков_Илья_Сергеевич|Илья Шишков]] (1-4, 8), [[Участник:Темербекова_Гульгайша|Гульгайша Темербекова]]&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;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; Нейский И.М. Классификация и сравнение методов кластеризации[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=15264</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=15264"/>
		<updated>2016-10-31T19:13:59Z</updated>

		<summary type="html">&lt;p&gt;Темербекова Гульгайша: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;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; Нейский И.М. Классификация и сравнение методов кластеризации[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%A2%D0%B5%D0%BC%D0%B5%D1%80%D0%B1%D0%B5%D0%BA%D0%BE%D0%B2%D0%B0_%D0%93%D1%83%D0%BB%D1%8C%D0%B3%D0%B0%D0%B9%D1%88%D0%B0&amp;diff=13439</id>
		<title>Участник:Темербекова Гульгайша</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%A2%D0%B5%D0%BC%D0%B5%D1%80%D0%B1%D0%B5%D0%BA%D0%BE%D0%B2%D0%B0_%D0%93%D1%83%D0%BB%D1%8C%D0%B3%D0%B0%D0%B9%D1%88%D0%B0&amp;diff=13439"/>
		<updated>2016-10-22T14:55:03Z</updated>

		<summary type="html">&lt;p&gt;Темербекова Гульгайша: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Студентка ВМК, группа 618/2, e-mail: gulgaisha93@mail.ru&lt;br /&gt;
&lt;br /&gt;
#перенаправление [[Алгоритм HCM (Hard C – Means)]]&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=13047</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=13047"/>
		<updated>2016-10-17T19:11:09Z</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;
&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=13046</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=13046"/>
		<updated>2016-10-17T19:10: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(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;
Последовательность исполнения метода следующая &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=13045</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=13045"/>
		<updated>2016-10-17T19:09:27Z</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(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;
Последовательность исполнения метода следующая &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=13044</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=13044"/>
		<updated>2016-10-17T19:08: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;&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;
Последовательность исполнения метода следующая &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=13043</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=13043"/>
		<updated>2016-10-17T18:58:11Z</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;&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;
Последовательность исполнения метода следующая &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;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=13042</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=13042"/>
		<updated>2016-10-17T18:43: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(ncK)&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(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;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=13041</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=13041"/>
		<updated>2016-10-17T18:41:39Z</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;&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(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;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;/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=13040</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=13040"/>
		<updated>2016-10-17T18:40:53Z</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;&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(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;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;/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=13039</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=13039"/>
		<updated>2016-10-17T18:22: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;&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(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;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;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;/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=13038</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=13038"/>
		<updated>2016-10-17T18:21:16Z</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;&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(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;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;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(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=13037</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=13037"/>
		<updated>2016-10-17T17:58:35Z</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;&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(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;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;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;/div&gt;</summary>
		<author><name>Темербекова Гульгайша</name></author>
	</entry>
</feed>