<?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=Illusive+mike</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=Illusive+mike"/>
	<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/Illusive_mike"/>
	<updated>2026-10-22T19:53:48Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<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:Nikmedoed&amp;diff=21144</id>
		<title>Обсуждение участника:Nikmedoed</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:Nikmedoed&amp;diff=21144"/>
		<updated>2016-12-17T17:42:46Z</updated>

		<summary type="html">&lt;p&gt;Illusive mike: /* Статья Участник:Nikmedoed/Нечеткий алгоритм С-средних (Fuzzy C-means) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Статья [[Участник:Nikmedoed/Нечеткий алгоритм С-средних (Fuzzy C-means)]] =&lt;br /&gt;
&lt;br /&gt;
* 1.2 — зачем писать корень из квадрата нормы? [[Участник:Chalker|Chalker]] ([[Обсуждение участника:Chalker|обсуждение]]) 20:27, 17 декабря 2016 (MSK)&lt;br /&gt;
** Корень квадрата взят именно потому, что значение нормы вычисляется через квадрат. Хотя фактически, как указано в 1.3, корень вообще не берётся, а используется квадрат нормы.&lt;br /&gt;
* 1.3 — «При реальном вычислении некоторые повторяющиеся вычисления могут быть устранены.» — что значит «реальное вычисление» и какие ещё вычисления бывают? [[Участник:Chalker|Chalker]] ([[Обсуждение участника:Chalker|обсуждение]]) 20:27, 17 декабря 2016 (MSK)&lt;br /&gt;
** Заменено на &amp;quot;при реализации алгоритма...&amp;quot;&lt;br /&gt;
* 1.4 — «Как правило в Евклидовом пространстве» — можете привести обратный пример? И в Евклидовом пространстве можно определять разные нормы. [[Участник:Chalker|Chalker]] ([[Обсуждение участника:Chalker|обсуждение]]) 20:27, 17 декабря 2016 (MSK)&lt;br /&gt;
** Фрагмент убран.&lt;br /&gt;
* 1.5 — «осуществляются итерации» и перечисление — на самом деле это одна итерация, формулировки неаккуратные. [[Участник:Chalker|Chalker]] ([[Обсуждение участника:Chalker|обсуждение]]) 20:27, 17 декабря 2016 (MSK)&lt;br /&gt;
** Формулировка перефразирована.&lt;br /&gt;
* 1.6 — в терминах каких операций вычисляется сложность? [[Участник:Chalker|Chalker]] ([[Обсуждение участника:Chalker|обсуждение]]) 20:27, 17 декабря 2016 (MSK)&lt;br /&gt;
** В терминах операций сложения/вычитания, умножения/деления и возведения в степень.&lt;br /&gt;
* 1.7 — стоит переобозначить номер процесса одной буквой, rnk читается плохо, учитывая, что ранее введены k и n. [[Участник:Chalker|Chalker]] ([[Обсуждение участника:Chalker|обсуждение]]) 20:27, 17 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
* не указан вклад каждого автора [[Участник:Coctic|Coctic]] ([[Обсуждение участника:Coctic|обсуждение]]) 13:01, 25 октября 2016 (MSK)&lt;br /&gt;
** Могли бы вы подсказать в каком формате это сделать? Просто общее сообщение, либо в каждом пункте указать?&lt;br /&gt;
*** В начале написать &amp;quot;Авторы: Автор1 - раздел 1, Автор2 - раздел 2&amp;quot;. Ну или что-то в том духе. [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 18:01, 28 октября 2016 (MSK)&lt;br /&gt;
:::: Исправлено [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 13:32, 31 октября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
* п. 1.2 приведен набор формул, однако отсутствует пояснения, как эти формулы складываются в алгоритм [[Участник:Coctic|Coctic]] ([[Обсуждение участника:Coctic|обсуждение]]) 13:01, 25 октября 2016 (MSK)&lt;br /&gt;
** П. 1.2 расширен в соответствии с замечанием. Ожидаю отзыв. [[Участник:Illusive_mike|Дворецкий М.С.]] ([[Обсуждение участника:Illusive_mike|обсуждение]]) 15:46, 25 октября 2016 (MSK)&lt;br /&gt;
::: Исправлено [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 13:32, 31 октября 2016 (MSK)&lt;br /&gt;
----------------&lt;br /&gt;
* п. 2.4. проведены исследования масштабируемости одной итерации. Исследование масштабируемости реализации в целом отсутствует [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 10:27, 17 ноября 2016 (MSK)&lt;br /&gt;
** Добавлено в статью: &amp;quot;Алгоритм обладает плохо исследованной сходимостью, но объем вычислений и итераций не зависит от значений данных, поэтому данное исследование масштабируемости было произведено для единичной итерации.&amp;quot;&lt;br /&gt;
** Принято [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 12:41, 18 ноября 2016 (MSK)&lt;br /&gt;
* п. 2.4. Рис. 2 приведен график зависимости эффективности от параметров задачи. Не указано, о каком виде эффективности идет речь. Значение эффективности в 100% в реальности встречается очень редко, надо в тексте пояснить, почему такой хороший результат. [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 10:27, 17 ноября 2016 (MSK)&lt;br /&gt;
** Добавили пояснение, что это график временной эффективности&lt;br /&gt;
** Что такое временная эффективность? В [[Глоссарий|глоссарии]] такой нет. [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 12:41, 18 ноября 2016 (MSK)&lt;br /&gt;
*** Изменено на термин из глоссария - эффективность распараллеливания.&lt;br /&gt;
** Добавили пояснение про причину высокой временной эффективности&lt;br /&gt;
** Принято [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 16:40, 18 ноября 2016 (MSK)&lt;br /&gt;
* п. 2.4. &#039;&#039;Для большинства экспериментов эффективность находится в пределах 100±3%.&#039;&#039;. Как эффективность может быть больше 100%? [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 10:27, 17 ноября 2016 (MSK)&lt;br /&gt;
** Сверхлинейное ускорение&lt;br /&gt;
** [https://www.dropbox.com/s/2ijzr6g8mhrftts/%D0%B8%D1%82%D0%BE%D0%B3%D0%B8%20%D1%82%D0%B5%D1%81%D1%82%D0%B0.xlsx?dl=0 Ссылка на расчёты]&lt;br /&gt;
** Доступная нам система профилировки недостаточна, чтобы найти причину сверхлинейного ускорения точно, поэтому мы не упомянули её прямым текстом&lt;br /&gt;
** Сначала надо разобраться, какая эффективность имеется в виду. [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 12:41, 18 ноября 2016 (MSK)&lt;br /&gt;
** Принято [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 16:40, 18 ноября 2016 (MSK)&lt;br /&gt;
* П. 2.4. Необходимо добавить описание ключей компилятора, особенностей запуска (раздел, используемые вычислительные узлы и т.п. информация, достаточная для воспроизведения данных). [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 16:40, 18 ноября 2016 (MSK)&lt;br /&gt;
** Добавлен файл README в проекте на GitHub. Это исправление мой товарищ сделал ещё 18, т.к. у меня не было доступа к чему-либо до вчера. А теперь обновил я ссылку.&lt;br /&gt;
** Принято [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 10:17, 21 ноября 2016 (MSK)&lt;/div&gt;</summary>
		<author><name>Illusive mike</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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=21143</id>
		<title>Участник:Nikmedoed/Нечеткий алгоритм С-средних (Fuzzy 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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=21143"/>
		<updated>2016-12-17T17:38:44Z</updated>

		<summary type="html">&lt;p&gt;Illusive mike: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|{{REVISIONUSER}}}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нечеткий алгоритм С-средних (Fuzzy C-means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(c^2 MI + cMnI), (I&amp;lt;/math&amp;gt; - число итераций, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - число точек, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - размерность точек (свойств на объект)&amp;lt;math&amp;gt;)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(c^2 I + cnI)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O( M )&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Nikmedoed|Н.А. Муромцев]] - перенос в вики, раздел 2, картинки, [[Участник:illusive_mike|М.С. Дворецкий]] - раздел 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Нечеткий алгоритм С-средних&#039;&#039;&#039; (&#039;&#039;Fuzzy C-means&#039;&#039;) - позволяет получить нечёткую кластеризацию больших наборов числовых данных, что позволяет корректно определять объекты на границах кластеров. Однако, выполнение данного алгоритма требует серьёзных вычислительных ресурсов, а также изначального задания количества кластеров. Кроме того, может возникнуть неоднозначность с объектами, удалёнными от центров всех кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм кластеризации Fuzzy C-Means (FCM) был предложен Дж. Данном в 1973 году &amp;lt;ref&amp;gt;Dunn, J.C.: A Fuzzy Relative of the ISODATA Process and Its Use in Detecting Compact Well-Separated Clusters. Journal of Cybernetics. 3 (1973): 32–57&amp;lt;/ref&amp;gt; и доработан Дж. Бездеком в 1981 году &amp;lt;ref&amp;gt;Bezdek, J.C.: Pattern Recognition with Fuzzy Objective Function Algorithms. Plenum Press, New York (1981). ISBN 0-306-40671-3&amp;lt;/ref&amp;gt;. В отличие от большинства существующих алгоритмов кластеризации, данный алгоритм является нечётким – каждый из объектов не входит однозначно в какой-либо кластер, а принадлежит всем кластерам с различными степенями принадлежности. Это даёт преимущества в качестве разбиения в случаях, когда кластеры находятся близко друг к другу, и большое число точек находится на их границах. Однако ценой такой нечёткости служат большие вычислительные затраты, чем у таких чётких алгоритмов, как [[Hard C-Means]] и [[K-Means]], при сохранении таких их недостатков, как априорное определение числа кластеров и отсутствие гарантии глобальной оптимальности результата.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Исходные данные: массив объектов &amp;lt;math&amp;gt;{X_k}\in{\R^n}, k=\overline{1,M}&amp;lt;/math&amp;gt;, число кластеров c, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица разбиения &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;M\times c&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;), центры кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, расстояния &amp;lt;math&amp;gt;D_{ki}&amp;lt;/math&amp;gt; между объектами и центрами кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода (вычисляются последовательно на каждой итерации):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Уточнение центров кластеров по степеням принадлежности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;V_i=\frac{\sum^{M}_{k=1} {\mu^m_{ki} * X_k}}{\sum^{M}_{k=1} {\mu^m_{ki}}},i=\overline{1,c}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
2. Расчёт расстояний между новыми центрами кластеров и точками данных&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
3. Пересчёт степеней принадлежности объектов кластерам&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} \left ( {\frac{D_{ki}}{D_{kj}}} \right ) }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждой итерации алгоритма происходит уточнение элементов матрицы &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Выходом алгоритма служит матрица &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, к которой алгоритм сходится. Факт того, что алгоритм сошёлся, устанавливается проверкой вида &amp;lt;math&amp;gt;\max_{k = \overline{1,M},i = \overline{1,c}} {( \left | \mu_{ki} - \mu_{ki}^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;  либо  &amp;lt;math&amp;gt;\max_{i = \overline{1,c}} {( \left | V_i - V_i^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mu_{ki}^* (V_i^*)&amp;lt;/math&amp;gt; – значение &amp;lt;math&amp;gt;\mu_{ki}(V_i)&amp;lt;/math&amp;gt;, вычисленное на предыдущей итерации.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Вычислительное ядро алгоритма Fuzzy C-Means составляют шаги вычисления центров кластеров, расстояний между ними и точками данных и в особенности пересчёта матрицы степеней принадлежности точек данных.&lt;br /&gt;
&lt;br /&gt;
При реализации алгоритма некоторые повторяющиеся вычисления могут быть устранены. Так, для шага вычисления центров кластеров величины &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; могут вычисляться однократно и умножаться на &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt; при включении в сумму, записанную в числителе. Для шага вычисления расстояний между центрами кластеров и точками, операция взятия квадратного корня не является обязательной, так как в дальнейшем на шаге вычисления степеней принадлежности можно непосредственно использовать квадраты этих расстояний, и сумма в знаменателе будет приобретать вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum^{c}_{j=1} {\left ( \frac{D_{ki} ^ {2}}{D_{kj} ^ {2}} \right )}^{{1}/{m-1}}&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;
Инициализация происходит случайным заполнением матрицы принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; с соблюдением условия нормировки &amp;lt;math&amp;gt;\sum_{i=1}^c {\mu_{ki} =1}&amp;lt;/math&amp;gt; и переходом к шагу 1, либо случайным определением центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt; и переходом к шагу 2.&lt;br /&gt;
&lt;br /&gt;
Далее осуществляются итерации, на каждой из которых производятся следующие вычисления:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;V_i=\frac{\sum_{k=1}^{M} {\mu_{ki}^m * X_k}}{\sum_{k=1}^{M} {\mu_{ki}^m} },i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} {\left ( \frac{D_{ki}}{D_{kj}} \right )} }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конце каждой итерации проверяется условие останова вида &amp;lt;math&amp;gt;\max_{k = \overline{1,M},i = \overline{1,c}} {( \left | \mu_{ki} - \mu_{ki}^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, либо &amp;lt;math&amp;gt;\max_{i = \overline{1,c}} {( \left | V_i - V_i^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mu_{ki}^* (V_i^*)&amp;lt;/math&amp;gt; – значение &amp;lt;math&amp;gt;\mu_{ki}(V_i)&amp;lt;/math&amp;gt;, вычисленное на предыдущей итерации. Если условие не выполнено, осуществляется переход к шагу 1.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
При кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; объектов данных, представленных точками в &amp;lt;math&amp;gt;\R^n&amp;lt;/math&amp;gt;, на &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; кластеров, алгоритм Fuzzy C-Means в последовательном варианте имеет вычислительную сложность – &amp;lt;math&amp;gt;O(c^2 MI+cMnI)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; – число итераций. Если считать размерность данных &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; малой, то эта сложность сводится к &amp;lt;math&amp;gt;O(c^2 MI)&amp;lt;/math&amp;gt;. Основной частью алгоритма в этом случае является пересчёт матрицы принадлежностей, требующий вычисления &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt; сумм из &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; слагаемых на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Приведём граф единичной итерации алгоритма в параллельном оптимизированном варианте (метод распараллеливания взят в &amp;lt;ref&amp;gt;Kwok, T., Smith, K.,&lt;br /&gt;
Lozano, S., Taniar, D.: [http://num-meth.srcc.msu.ru/zhurnal/tom_2012/pdf/v13r207.pdf Parallel Fuzzy c-Means Clustering for Large Data Sets], последнее обращение 25.10.2016&amp;lt;/ref&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
[[File:C-means_paralle_graph.png|thumb|upright=2.5|frame|center|alt=Paralel Fuzzy C-Means|Каждая вершина данного графа соответствует операциям из алгоритма, указанным при помощи указанных формул. Каждый из p столбцов соответствует работе одного из процессов. Пометки справа указывают число повторений каждого узла в ходе одной итерации.]]&lt;br /&gt;
&lt;br /&gt;
Раздел 1.8 уточняет, соответствуют ли эти повторения однотипным ярусам или точкам данных, вычисления для которых можно распараллелить и далее.&lt;br /&gt;
&lt;br /&gt;
Каждый процесс обладает следующими данными:&lt;br /&gt;
* координатами точек данных &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p}+1)}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;rnk&amp;lt;/math&amp;gt; – номер процесса,&lt;br /&gt;
* значениями &amp;lt;math&amp;gt;\mu_{ki}&amp;lt;/math&amp;gt; степени принадлежности для своих точек (&amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p} +1)}, i=\overline{1,c}&amp;lt;/math&amp;gt;),&lt;br /&gt;
* координатами центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=\overline{1,c}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Суммы &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m X_k}&amp;lt;/math&amp;gt; вычисляются одновременно, поэтому значения &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; вычисляются по одному разу за итерацию. Таким образом, второй ярус операций на рисунке на деле не содержит операций возведения в степень.&lt;br /&gt;
За счёт линейности большинства выражений относительно данных по точкам, процессы взаимодействуют только при редукции сумм, составляющих &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;. Всё остальное время каждый процессор работает только со своими &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точками. Это обеспечивает применимость алгоритма для больших &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
При распараллеливании по точкам исходных данных и условии останову по малому изменению степеней принадлежности выполнение одной итерации алгоритма FCM может быть разделено на следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм знаменателя (по &amp;lt;math&amp;gt;\frac{M}{p}-1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; операций возведения в степень на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм числителя (по &amp;lt;math&amp;gt;\frac{M}{p} -1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; умножений на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; редукции сумм и передач значений &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt; процессам (получение &amp;lt;math&amp;gt;c(n+1)&amp;lt;/math&amp;gt; значений, &amp;lt;math&amp;gt;cn&amp;lt;/math&amp;gt; делений),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&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; умножений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов вычисления степеней принадлежности точек (по &amp;lt;math&amp;gt;c+1&amp;lt;/math&amp;gt; делений, c возведений в степень, &amp;lt;math&amp;gt;c-1&amp;lt;/math&amp;gt; сложений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* до &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов проверки условий останова (по &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; вычитанию, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; сравнению), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; редукция для обмена статусом завершения.&lt;br /&gt;
Таким образом, при распараллеливании по точкам исходных данных при условии наличия в каждом узле достаточного объёма памяти для хранения всего массива координат центров кластеров высота и ширина ЯПФ алгоритма FCM равны соответственно &amp;lt;math&amp;gt;O(c^2 I+cnI)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: массив векторов &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt;, число кластеров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt; для входных векторов, 3 вспомогательных параметра.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;). Условие нормировки: &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
В случае неограниченного распараллеливания по точкам данных (1 процесс на точку), отношение последовательной сложности алгоритма к параллельной пропорционально &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; задаёт степень «размытости» кластеров. В отсутствие априорных данных его обычно берут равным 2. В предельном случае сведения параметра &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; к значению 1, кластеры становятся чёткими и алгоритм вырождается в алгоритм кластеризации K-Means.&lt;br /&gt;
&lt;br /&gt;
Алгоритм недетерминирован, начальное положение кластеров задаётся случайно либо явно, либо опосредованно (через матрицу принадлежности). Алгоритм сходится к локальному экстремуму &amp;lt;ref&amp;gt;Höppner, F., Klawonn, F.: [https://public.fh wolfenbuettel.de/~klawonn/Papers/hoeppnerklawonntfs03.pdf A Contribution to Convergence Theory of Fuzzy c-Means and Derivatives], Дата последнего обращения: 13.10.2016&amp;lt;/ref&amp;gt; и, таким образом, не гарантирует оптимальный результат при случайном выборе начальных значений.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
[[File:График.png|thumb|upright=2.5|frame|right|alt=Paralel Fuzzy C-Means time to iteration|График зависимости времени выполнения итерации параллельного нечеткого алгоритма С-средних (Fuzzy C-means) от количества процессоров и количества кластеризуемых вершин]]&lt;br /&gt;
&lt;br /&gt;
[[File:Effect_parallel_fuzzy_c-means.png|thumb|upright=2.5|frame|right|alt=Paralel Fuzzy C-Means efficiency|График эффективности распараллеливания нечеткого алгоритма С-средних (Fuzzy C-means) в зависимости от количества процессоров и количества кластеризуемых вершин.]]&lt;br /&gt;
&lt;br /&gt;
Исследование проведено на суперкомпьютере IBM Blue Gene/P&amp;lt;ref&amp;gt;[http://hpc.cs.msu.ru/bgp Описание вычислительного комплекса IBM Blue Gene/P]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Для исследования была использована последовательная реализация алгоритма и реализован её [https://github.com/IllusiveMike/Parallel-Fuzzy-C-means/tree/patch-1 параллельный вариант]&amp;lt;ref&amp;gt;[https://github.com/nikmedoed/Parallel-Fuzzy-C-means Параллельная реализация алгоритма Fuzzy C-Means]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Алгоритм обладает плохо исследованной сходимостью, но объем вычислений на итерации не зависит от значений данных, поэтому данное исследование масштабируемости было произведено для единичной итерации.&lt;br /&gt;
&lt;br /&gt;
Для упрощения экспериментов было решено использовать количество вершин для кластеризации и количество процессов равное степени двойки, поэтому для каждого эксперимента были выбраны значения:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^v, v=\overline{0,9}&amp;lt;/math&amp;gt;, для количества процессоров;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^w, w=\overline{10,20}&amp;lt;/math&amp;gt;, для количества кластеризуемых вершин.&lt;br /&gt;
&lt;br /&gt;
Для одного набора значений проводилось 4 эксперимента и результаты усреднялись. При повторных запусках экспериментов значения выходили те же самые.&lt;br /&gt;
&lt;br /&gt;
Полученные результаты говорят о хорошей масштабируемости реализации алгоритма. Для большинства экспериментов эффективность распараллеливания находится в пределах 100±3%. Высокая эффективность обуславливается тем, что данные равномерно распределены по процессорам и на каждой итерации требуется глобальная редукция всего &amp;lt;math&amp;gt;2c+1&amp;lt;/math&amp;gt; значений (&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значений числителей центроид кластеров, &amp;lt;math&amp;gt;c&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;
* пакет MATLAB &amp;lt;ref&amp;gt;[http://www.mathworks.com/help/fuzzy/fcm.html Документация пакета MATLAB, функция fcm], последнее обращение 15.10.2016&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Реализация алгоритма на POSTGRESQL &amp;lt;ref&amp;gt;[http://num-meth.srcc.msu.ru/zhurnal/tom_2012/pdf/v13r207.pdf Реализация алгоритма Fuzzy C-means на POSTGRESQL], последнее обращение 15.10.2016&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en:Parallel Fuzzy c-Means Clustering]]&lt;/div&gt;</summary>
		<author><name>Illusive mike</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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=21142</id>
		<title>Участник:Nikmedoed/Нечеткий алгоритм С-средних (Fuzzy 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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=21142"/>
		<updated>2016-12-17T17:37:19Z</updated>

		<summary type="html">&lt;p&gt;Illusive mike: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|{{REVISIONUSER}}}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нечеткий алгоритм С-средних (Fuzzy C-means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(c^2 MI + cMnI), (I&amp;lt;/math&amp;gt; - число итераций, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - число точек, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - размерность точек (свойств на объект)&amp;lt;math&amp;gt;)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(c^2 I + cnI)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O( M )&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Nikmedoed|Н.А. Муромцев]] - перенос в вики, раздел 2, картинки, [[Участник:illusive_mike|М.С. Дворецкий]] - раздел 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Нечеткий алгоритм С-средних&#039;&#039;&#039; (&#039;&#039;Fuzzy C-means&#039;&#039;) - позволяет получить нечёткую кластеризацию больших наборов числовых данных, что позволяет корректно определять объекты на границах кластеров. Однако, выполнение данного алгоритма требует серьёзных вычислительных ресурсов, а также изначального задания количества кластеров. Кроме того, может возникнуть неоднозначность с объектами, удалёнными от центров всех кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм кластеризации Fuzzy C-Means (FCM) был предложен Дж. Данном в 1973 году &amp;lt;ref&amp;gt;Dunn, J.C.: A Fuzzy Relative of the ISODATA Process and Its Use in Detecting Compact Well-Separated Clusters. Journal of Cybernetics. 3 (1973): 32–57&amp;lt;/ref&amp;gt; и доработан Дж. Бездеком в 1981 году &amp;lt;ref&amp;gt;Bezdek, J.C.: Pattern Recognition with Fuzzy Objective Function Algorithms. Plenum Press, New York (1981). ISBN 0-306-40671-3&amp;lt;/ref&amp;gt;. В отличие от большинства существующих алгоритмов кластеризации, данный алгоритм является нечётким – каждый из объектов не входит однозначно в какой-либо кластер, а принадлежит всем кластерам с различными степенями принадлежности. Это даёт преимущества в качестве разбиения в случаях, когда кластеры находятся близко друг к другу, и большое число точек находится на их границах. Однако ценой такой нечёткости служат большие вычислительные затраты, чем у таких чётких алгоритмов, как [[Hard C-Means]] и [[K-Means]], при сохранении таких их недостатков, как априорное определение числа кластеров и отсутствие гарантии глобальной оптимальности результата.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Исходные данные: массив объектов &amp;lt;math&amp;gt;{X_k}\in{\R^n}, k=\overline{1,M}&amp;lt;/math&amp;gt;, число кластеров c, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица разбиения &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;M\times c&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;), центры кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, расстояния &amp;lt;math&amp;gt;D_{ki}&amp;lt;/math&amp;gt; между объектами и центрами кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода (вычисляются последовательно на каждой итерации):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Уточнение центров кластеров по степеням принадлежности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;V_i=\frac{\sum^{M}_{k=1} {\mu^m_{ki} * X_k}}{\sum^{M}_{k=1} {\mu^m_{ki}}},i=\overline{1,c}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
2. Расчёт расстояний между новыми центрами кластеров и точками данных&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
3. Пересчёт степеней принадлежности объектов кластерам&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} \left ( {\frac{D_{ki}}{D_{kj}}} \right ) }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждой итерации алгоритма происходит уточнение элементов матрицы &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Выходом алгоритма служит матрица &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, к которой алгоритм сходится. Факт того, что алгоритм сошёлся, устанавливается проверкой вида &amp;lt;math&amp;gt;\max_{k = \overline{1,M},i = \overline{1,c}} {( \left | \mu_{ki} - \mu_{ki}^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;  либо  &amp;lt;math&amp;gt;\max_{i = \overline{1,c}} {( \left | V_i - V_i^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mu_{ki}^* (V_i^*)&amp;lt;/math&amp;gt; – значение &amp;lt;math&amp;gt;\mu_{ki}(V_i)&amp;lt;/math&amp;gt;, вычисленное на предыдущей итерации.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Вычислительное ядро алгоритма Fuzzy C-Means составляют шаги вычисления центров кластеров, расстояний между ними и точками данных и в особенности пересчёта матрицы степеней принадлежности точек данных.&lt;br /&gt;
&lt;br /&gt;
При реализации алгоритма некоторые повторяющиеся вычисления могут быть устранены. Так, для шага вычисления центров кластеров величины &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; могут вычисляться однократно и умножаться на &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt; при включении в сумму, записанную в числителе. Для шага вычисления расстояний между центрами кластеров и точками, операция взятия квадратного корня не является обязательной, так как в дальнейшем на шаге вычисления степеней принадлежности можно непосредственно использовать квадраты этих расстояний, и сумма в знаменателе будет приобретать вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum^{c}_{j=1} {\left ( \frac{D_{ki} ^ {2}}{D_{kj} ^ {2}} \right )}^{{1}/{m-1}}&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;
Инициализация происходит случайным заполнением матрицы принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; с соблюдением условия нормировки &amp;lt;math&amp;gt;\sum_{i=1}^c {\mu_{ki} =1}&amp;lt;/math&amp;gt; и переходом к шагу 1, либо случайным определением центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt; и переходом к шагу 2.&lt;br /&gt;
&lt;br /&gt;
Далее осуществляются итерации следующего вида:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;V_i=\frac{\sum_{k=1}^{M} {\mu_{ki}^m * X_k}}{\sum_{k=1}^{M} {\mu_{ki}^m} },i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} {\left ( \frac{D_{ki}}{D_{kj}} \right )} }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конце каждой итерации проверяется условие останова вида &amp;lt;math&amp;gt;\max_{k = \overline{1,M},i = \overline{1,c}} {( \left | \mu_{ki} - \mu_{ki}^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, либо &amp;lt;math&amp;gt;\max_{i = \overline{1,c}} {( \left | V_i - V_i^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mu_{ki}^* (V_i^*)&amp;lt;/math&amp;gt; – значение &amp;lt;math&amp;gt;\mu_{ki}(V_i)&amp;lt;/math&amp;gt;, вычисленное на предыдущей итерации. Если условие не выполнено, осуществляется переход к шагу 1.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
При кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; объектов данных, представленных точками в &amp;lt;math&amp;gt;\R^n&amp;lt;/math&amp;gt;, на &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; кластеров, алгоритм Fuzzy C-Means в последовательном варианте имеет вычислительную сложность – &amp;lt;math&amp;gt;O(c^2 MI+cMnI)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; – число итераций. Если считать размерность данных &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; малой, то эта сложность сводится к &amp;lt;math&amp;gt;O(c^2 MI)&amp;lt;/math&amp;gt;. Основной частью алгоритма в этом случае является пересчёт матрицы принадлежностей, требующий вычисления &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt; сумм из &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; слагаемых на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Приведём граф единичной итерации алгоритма в параллельном оптимизированном варианте (метод распараллеливания взят в &amp;lt;ref&amp;gt;Kwok, T., Smith, K.,&lt;br /&gt;
Lozano, S., Taniar, D.: [http://num-meth.srcc.msu.ru/zhurnal/tom_2012/pdf/v13r207.pdf Parallel Fuzzy c-Means Clustering for Large Data Sets], последнее обращение 25.10.2016&amp;lt;/ref&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
[[File:C-means_paralle_graph.png|thumb|upright=2.5|frame|center|alt=Paralel Fuzzy C-Means|Каждая вершина данного графа соответствует операциям из алгоритма, указанным при помощи указанных формул. Каждый из p столбцов соответствует работе одного из процессов. Пометки справа указывают число повторений каждого узла в ходе одной итерации.]]&lt;br /&gt;
&lt;br /&gt;
Раздел 1.8 уточняет, соответствуют ли эти повторения однотипным ярусам или точкам данных, вычисления для которых можно распараллелить и далее.&lt;br /&gt;
&lt;br /&gt;
Каждый процесс обладает следующими данными:&lt;br /&gt;
* координатами точек данных &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p}+1)}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;rnk&amp;lt;/math&amp;gt; – номер процесса,&lt;br /&gt;
* значениями &amp;lt;math&amp;gt;\mu_{ki}&amp;lt;/math&amp;gt; степени принадлежности для своих точек (&amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p} +1)}, i=\overline{1,c}&amp;lt;/math&amp;gt;),&lt;br /&gt;
* координатами центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=\overline{1,c}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Суммы &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m X_k}&amp;lt;/math&amp;gt; вычисляются одновременно, поэтому значения &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; вычисляются по одному разу за итерацию. Таким образом, второй ярус операций на рисунке на деле не содержит операций возведения в степень.&lt;br /&gt;
За счёт линейности большинства выражений относительно данных по точкам, процессы взаимодействуют только при редукции сумм, составляющих &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;. Всё остальное время каждый процессор работает только со своими &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точками. Это обеспечивает применимость алгоритма для больших &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
При распараллеливании по точкам исходных данных и условии останову по малому изменению степеней принадлежности выполнение одной итерации алгоритма FCM может быть разделено на следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм знаменателя (по &amp;lt;math&amp;gt;\frac{M}{p}-1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; операций возведения в степень на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм числителя (по &amp;lt;math&amp;gt;\frac{M}{p} -1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; умножений на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; редукции сумм и передач значений &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt; процессам (получение &amp;lt;math&amp;gt;c(n+1)&amp;lt;/math&amp;gt; значений, &amp;lt;math&amp;gt;cn&amp;lt;/math&amp;gt; делений),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&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; умножений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов вычисления степеней принадлежности точек (по &amp;lt;math&amp;gt;c+1&amp;lt;/math&amp;gt; делений, c возведений в степень, &amp;lt;math&amp;gt;c-1&amp;lt;/math&amp;gt; сложений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* до &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов проверки условий останова (по &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; вычитанию, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; сравнению), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; редукция для обмена статусом завершения.&lt;br /&gt;
Таким образом, при распараллеливании по точкам исходных данных при условии наличия в каждом узле достаточного объёма памяти для хранения всего массива координат центров кластеров высота и ширина ЯПФ алгоритма FCM равны соответственно &amp;lt;math&amp;gt;O(c^2 I+cnI)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: массив векторов &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt;, число кластеров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt; для входных векторов, 3 вспомогательных параметра.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;). Условие нормировки: &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
В случае неограниченного распараллеливания по точкам данных (1 процесс на точку), отношение последовательной сложности алгоритма к параллельной пропорционально &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; задаёт степень «размытости» кластеров. В отсутствие априорных данных его обычно берут равным 2. В предельном случае сведения параметра &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; к значению 1, кластеры становятся чёткими и алгоритм вырождается в алгоритм кластеризации K-Means.&lt;br /&gt;
&lt;br /&gt;
Алгоритм недетерминирован, начальное положение кластеров задаётся случайно либо явно, либо опосредованно (через матрицу принадлежности). Алгоритм сходится к локальному экстремуму &amp;lt;ref&amp;gt;Höppner, F., Klawonn, F.: [https://public.fh wolfenbuettel.de/~klawonn/Papers/hoeppnerklawonntfs03.pdf A Contribution to Convergence Theory of Fuzzy c-Means and Derivatives], Дата последнего обращения: 13.10.2016&amp;lt;/ref&amp;gt; и, таким образом, не гарантирует оптимальный результат при случайном выборе начальных значений.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
[[File:График.png|thumb|upright=2.5|frame|right|alt=Paralel Fuzzy C-Means time to iteration|График зависимости времени выполнения итерации параллельного нечеткого алгоритма С-средних (Fuzzy C-means) от количества процессоров и количества кластеризуемых вершин]]&lt;br /&gt;
&lt;br /&gt;
[[File:Effect_parallel_fuzzy_c-means.png|thumb|upright=2.5|frame|right|alt=Paralel Fuzzy C-Means efficiency|График эффективности распараллеливания нечеткого алгоритма С-средних (Fuzzy C-means) в зависимости от количества процессоров и количества кластеризуемых вершин.]]&lt;br /&gt;
&lt;br /&gt;
Исследование проведено на суперкомпьютере IBM Blue Gene/P&amp;lt;ref&amp;gt;[http://hpc.cs.msu.ru/bgp Описание вычислительного комплекса IBM Blue Gene/P]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Для исследования была использована последовательная реализация алгоритма и реализован её [https://github.com/IllusiveMike/Parallel-Fuzzy-C-means/tree/patch-1 параллельный вариант]&amp;lt;ref&amp;gt;[https://github.com/nikmedoed/Parallel-Fuzzy-C-means Параллельная реализация алгоритма Fuzzy C-Means]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Алгоритм обладает плохо исследованной сходимостью, но объем вычислений на итерации не зависит от значений данных, поэтому данное исследование масштабируемости было произведено для единичной итерации.&lt;br /&gt;
&lt;br /&gt;
Для упрощения экспериментов было решено использовать количество вершин для кластеризации и количество процессов равное степени двойки, поэтому для каждого эксперимента были выбраны значения:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^v, v=\overline{0,9}&amp;lt;/math&amp;gt;, для количества процессоров;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^w, w=\overline{10,20}&amp;lt;/math&amp;gt;, для количества кластеризуемых вершин.&lt;br /&gt;
&lt;br /&gt;
Для одного набора значений проводилось 4 эксперимента и результаты усреднялись. При повторных запусках экспериментов значения выходили те же самые.&lt;br /&gt;
&lt;br /&gt;
Полученные результаты говорят о хорошей масштабируемости реализации алгоритма. Для большинства экспериментов эффективность распараллеливания находится в пределах 100±3%. Высокая эффективность обуславливается тем, что данные равномерно распределены по процессорам и на каждой итерации требуется глобальная редукция всего &amp;lt;math&amp;gt;2c+1&amp;lt;/math&amp;gt; значений (&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значений числителей центроид кластеров, &amp;lt;math&amp;gt;c&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;
* пакет MATLAB &amp;lt;ref&amp;gt;[http://www.mathworks.com/help/fuzzy/fcm.html Документация пакета MATLAB, функция fcm], последнее обращение 15.10.2016&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Реализация алгоритма на POSTGRESQL &amp;lt;ref&amp;gt;[http://num-meth.srcc.msu.ru/zhurnal/tom_2012/pdf/v13r207.pdf Реализация алгоритма Fuzzy C-means на POSTGRESQL], последнее обращение 15.10.2016&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en:Parallel Fuzzy c-Means Clustering]]&lt;/div&gt;</summary>
		<author><name>Illusive mike</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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=21141</id>
		<title>Участник:Nikmedoed/Нечеткий алгоритм С-средних (Fuzzy 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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=21141"/>
		<updated>2016-12-17T17:34:03Z</updated>

		<summary type="html">&lt;p&gt;Illusive mike: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|{{REVISIONUSER}}}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нечеткий алгоритм С-средних (Fuzzy C-means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(c^2 MI + cMnI), (I&amp;lt;/math&amp;gt; - число итераций, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - число точек, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - размерность точек (свойств на объект)&amp;lt;math&amp;gt;)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(c^2 I + cnI)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O( M )&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Nikmedoed|Н.А. Муромцев]] - перенос в вики, раздел 2, картинки, [[Участник:illusive_mike|М.С. Дворецкий]] - раздел 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Нечеткий алгоритм С-средних&#039;&#039;&#039; (&#039;&#039;Fuzzy C-means&#039;&#039;) - позволяет получить нечёткую кластеризацию больших наборов числовых данных, что позволяет корректно определять объекты на границах кластеров. Однако, выполнение данного алгоритма требует серьёзных вычислительных ресурсов, а также изначального задания количества кластеров. Кроме того, может возникнуть неоднозначность с объектами, удалёнными от центров всех кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм кластеризации Fuzzy C-Means (FCM) был предложен Дж. Данном в 1973 году &amp;lt;ref&amp;gt;Dunn, J.C.: A Fuzzy Relative of the ISODATA Process and Its Use in Detecting Compact Well-Separated Clusters. Journal of Cybernetics. 3 (1973): 32–57&amp;lt;/ref&amp;gt; и доработан Дж. Бездеком в 1981 году &amp;lt;ref&amp;gt;Bezdek, J.C.: Pattern Recognition with Fuzzy Objective Function Algorithms. Plenum Press, New York (1981). ISBN 0-306-40671-3&amp;lt;/ref&amp;gt;. В отличие от большинства существующих алгоритмов кластеризации, данный алгоритм является нечётким – каждый из объектов не входит однозначно в какой-либо кластер, а принадлежит всем кластерам с различными степенями принадлежности. Это даёт преимущества в качестве разбиения в случаях, когда кластеры находятся близко друг к другу, и большое число точек находится на их границах. Однако ценой такой нечёткости служат большие вычислительные затраты, чем у таких чётких алгоритмов, как [[Hard C-Means]] и [[K-Means]], при сохранении таких их недостатков, как априорное определение числа кластеров и отсутствие гарантии глобальной оптимальности результата.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Исходные данные: массив объектов &amp;lt;math&amp;gt;{X_k}\in{\R^n}, k=\overline{1,M}&amp;lt;/math&amp;gt;, число кластеров c, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица разбиения &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;M\times c&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;), центры кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, расстояния &amp;lt;math&amp;gt;D_{ki}&amp;lt;/math&amp;gt; между объектами и центрами кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода (вычисляются последовательно на каждой итерации):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Уточнение центров кластеров по степеням принадлежности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;V_i=\frac{\sum^{M}_{k=1} {\mu^m_{ki} * X_k}}{\sum^{M}_{k=1} {\mu^m_{ki}}},i=\overline{1,c}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
2. Расчёт расстояний между новыми центрами кластеров и точками данных&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
3. Пересчёт степеней принадлежности объектов кластерам&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} \left ( {\frac{D_{ki}}{D_{kj}}} \right ) }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждой итерации алгоритма происходит уточнение элементов матрицы &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Выходом алгоритма служит матрица &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, к которой алгоритм сходится. Факт того, что алгоритм сошёлся, устанавливается проверкой вида &amp;lt;math&amp;gt;\max_{k = \overline{1,M},i = \overline{1,c}} {( \left | \mu_{ki} - \mu_{ki}^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;  либо  &amp;lt;math&amp;gt;\max_{i = \overline{1,c}} {( \left | V_i - V_i^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mu_{ki}^* (V_i^*)&amp;lt;/math&amp;gt; – значение &amp;lt;math&amp;gt;\mu_{ki}(V_i)&amp;lt;/math&amp;gt;, вычисленное на предыдущей итерации.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Вычислительное ядро алгоритма Fuzzy C-Means составляют шаги вычисления центров кластеров, расстояний между ними и точками данных и в особенности пересчёта матрицы степеней принадлежности точек данных.&lt;br /&gt;
&lt;br /&gt;
При реализации алгоритма некоторые повторяющиеся вычисления могут быть устранены. Так, для шага вычисления центров кластеров величины &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; могут вычисляться однократно и умножаться на &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt; при включении в сумму, записанную в числителе. Для шага вычисления расстояний между центрами кластеров и точками, операция взятия квадратного корня не является обязательной, так как в дальнейшем на шаге вычисления степеней принадлежности можно непосредственно использовать квадраты этих расстояний, и сумма в знаменателе будет приобретать вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum^{c}_{j=1} {\left ( \frac{D_{ki} ^ {2}}{D_{kj} ^ {2}} \right )}^{{1}/{m-1}}&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;
Инициализация происходит случайным заполнением матрицы принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; с соблюдением условия нормировки &amp;lt;math&amp;gt;\sum_{i=1}^c {\mu_{ki} =1}&amp;lt;/math&amp;gt; и переходом к шагу 1, либо случайным определением центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt; и переходом к шагу 2.&lt;br /&gt;
&lt;br /&gt;
Далее осуществляются итерации следующего вида:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;V_i=\frac{\sum_{k=1}^{M} {\mu_{ki}^m * X_k}}{\sum_{k=1}^{M} {\mu_{ki}^m} },i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} {\left ( \frac{D_{ki}}{D_{kj}} \right )} }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конце каждой итерации проверяется условие останова вида &amp;lt;math&amp;gt;\max_{k = \overline{1,M},i = \overline{1,c}} {( \left | \mu_{ki} - \mu_{ki}^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, либо &amp;lt;math&amp;gt;\max_{i = \overline{1,c}} {( \left | V_i - V_i^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mu_{ki}^* (V_i^*)&amp;lt;/math&amp;gt; – значение &amp;lt;math&amp;gt;\mu_{ki}(V_i)&amp;lt;/math&amp;gt;, вычисленное на предыдущей итерации. Если условие не выполнено, осуществляется переход к шагу 1.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
При кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; объектов данных, представленных точками в &amp;lt;math&amp;gt;\R^n&amp;lt;/math&amp;gt;, на &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; кластеров, алгоритм Fuzzy C-Means в последовательном варианте имеет вычислительную сложность – &amp;lt;math&amp;gt;O(c^2 MI+cMnI)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; – число итераций. Если считать размерность данных &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; малой, то эта сложность сводится к &amp;lt;math&amp;gt;O(c^2 MI)&amp;lt;/math&amp;gt;. Основной частью алгоритма в этом случае является пересчёт матрицы принадлежностей, требующий вычисления &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt; сумм из &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; слагаемых на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Приведём граф единичной итерации алгоритма в параллельном оптимизированном варианте (метод распараллеливания взят в &amp;lt;ref&amp;gt;Kwok, T., Smith, K.,&lt;br /&gt;
Lozano, S., Taniar, D.: [http://num-meth.srcc.msu.ru/zhurnal/tom_2012/pdf/v13r207.pdf Parallel Fuzzy c-Means Clustering for Large Data Sets], последнее обращение 25.10.2016&amp;lt;/ref&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
[[File:C-means_paralle_graph.png|thumb|upright=2.5|frame|center|alt=Paralel Fuzzy C-Means|Каждая вершина данного графа соответствует операциям из алгоритма, указанным при помощи указанных формул. Каждый из p столбцов соответствует работе одного из процессов. Пометки справа указывают число повторений каждого узла в ходе одной итерации.]]&lt;br /&gt;
&lt;br /&gt;
Раздел 1.8 уточняет, соответствуют ли эти повторения однотипным ярусам или точкам данных, вычисления для которых можно распараллелить и далее.&lt;br /&gt;
&lt;br /&gt;
Каждый процесс обладает следующими данными:&lt;br /&gt;
* координатами точек данных &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p}+1)}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;rnk&amp;lt;/math&amp;gt; – номер процесса,&lt;br /&gt;
* значениями &amp;lt;math&amp;gt;\mu_{ki}&amp;lt;/math&amp;gt; степени принадлежности для своих точек (&amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p} +1)}, i=\overline{1,c}&amp;lt;/math&amp;gt;),&lt;br /&gt;
* координатами центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=\overline{1,c}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Суммы &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m X_k}&amp;lt;/math&amp;gt; вычисляются одновременно, поэтому значения &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; вычисляются по одному разу за итерацию. Таким образом, второй ярус операций на рисунке на деле не содержит операций возведения в степень.&lt;br /&gt;
За счёт линейности большинства выражений относительно данных по точкам, процессы взаимодействуют только при редукции сумм, составляющих &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;. Всё остальное время каждый процессор работает только со своими &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точками. Это обеспечивает применимость алгоритма для больших &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
При распараллеливании по точкам исходных данных и условии останову по малому изменению степеней принадлежности выполнение одной итерации алгоритма FCM может быть разделено на следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм знаменателя (по &amp;lt;math&amp;gt;\frac{M}{p}-1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; операций возведения в степень на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм числителя (по &amp;lt;math&amp;gt;\frac{M}{p} -1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; умножений на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; редукции сумм и передач значений &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt; процессам (получение &amp;lt;math&amp;gt;c(n+1)&amp;lt;/math&amp;gt; значений, &amp;lt;math&amp;gt;cn&amp;lt;/math&amp;gt; делений),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&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; умножений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов вычисления степеней принадлежности точек (по &amp;lt;math&amp;gt;c+1&amp;lt;/math&amp;gt; делений, c возведений в степень, &amp;lt;math&amp;gt;c-1&amp;lt;/math&amp;gt; сложений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* до &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов проверки условий останова (по &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; вычитанию, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; сравнению), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; редукция для обмена статусом завершения.&lt;br /&gt;
Таким образом, при распараллеливании по точкам исходных данных при условии наличия в каждом узле достаточного объёма памяти для хранения всего массива координат центров кластеров высота и ширина ЯПФ алгоритма FCM равны соответственно &amp;lt;math&amp;gt;O(c^2 I+cnI)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: массив векторов &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt;, число кластеров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt; для входных векторов, 3 вспомогательных параметра.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;). Условие нормировки: &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
В случае неограниченного распараллеливания по точкам данных (1 процесс на точку), отношение последовательной сложности алгоритма к параллельной пропорционально &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; задаёт степень «размытости» кластеров. В отсутствие априорных данных его обычно берут равным 2. В предельном случае сведения параметра &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; к значению 1, кластеры становятся чёткими и алгоритм вырождается в алгоритм кластеризации K-Means.&lt;br /&gt;
&lt;br /&gt;
Алгоритм недетерминирован, начальное положение кластеров задаётся случайно либо явно, либо опосредованно (через матрицу принадлежности). Алгоритм сходится к локальному экстремуму &amp;lt;ref&amp;gt;Höppner, F., Klawonn, F.: [https://public.fh wolfenbuettel.de/~klawonn/Papers/hoeppnerklawonntfs03.pdf A Contribution to Convergence Theory of Fuzzy c-Means and Derivatives], Дата последнего обращения: 13.10.2016&amp;lt;/ref&amp;gt; и, таким образом, не гарантирует оптимальный результат при случайном выборе начальных значений.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
[[File:График.png|thumb|upright=2.5|frame|right|alt=Paralel Fuzzy C-Means time to iteration|График зависимости времени выполнения итерации параллельного нечеткого алгоритма С-средних (Fuzzy C-means) от количества процессоров и количества кластеризуемых вершин]]&lt;br /&gt;
&lt;br /&gt;
[[File:Effect_parallel_fuzzy_c-means.png|thumb|upright=2.5|frame|right|alt=Paralel Fuzzy C-Means efficiency|График эффективности распараллеливания нечеткого алгоритма С-средних (Fuzzy C-means) в зависимости от количества процессоров и количества кластеризуемых вершин.]]&lt;br /&gt;
&lt;br /&gt;
Исследование проведено на суперкомпьютере IBM Blue Gene/P&amp;lt;ref&amp;gt;[http://hpc.cs.msu.ru/bgp Описание вычислительного комплекса IBM Blue Gene/P]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Для исследования была использована последовательная реализация алгоритма и реализован её [https://github.com/IllusiveMike/Parallel-Fuzzy-C-means/tree/patch-1 параллельный вариант]&amp;lt;ref&amp;gt;[https://github.com/nikmedoed/Parallel-Fuzzy-C-means Параллельная реализация алгоритма Fuzzy C-Means]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Алгоритм обладает плохо исследованной сходимостью, но объем вычислений на итерации не зависит от значений данных, поэтому данное исследование масштабируемости было произведено для единичной итерации.&lt;br /&gt;
&lt;br /&gt;
Для упрощения экспериментов было решено использовать количество вершин для кластеризации и количество процессов равное степени двойки, поэтому для каждого эксперимента были выбраны значения:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^v, v=\overline{0,9}&amp;lt;/math&amp;gt;, для количества процессоров;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^w, w=\overline{10,20}&amp;lt;/math&amp;gt;, для количества кластеризуемых вершин.&lt;br /&gt;
&lt;br /&gt;
Для одного набора значений проводилось 4 эксперимента и результаты усреднялись. При повторных запусках экспериментов значения выходили те же самые.&lt;br /&gt;
&lt;br /&gt;
Полученные результаты говорят о хорошей масштабируемости реализации алгоритма. Для большинства экспериментов эффективность распараллеливания находится в пределах 100±3%. Высокая эффективность обуславливается тем, что данные равномерно распределены по процессорам и на каждой итерации требуется глобальная редукция всего &amp;lt;math&amp;gt;2c+1&amp;lt;/math&amp;gt; значений (&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значений числителей центроид кластеров, &amp;lt;math&amp;gt;c&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;
* пакет MATLAB &amp;lt;ref&amp;gt;[http://www.mathworks.com/help/fuzzy/fcm.html Документация пакета MATLAB, функция fcm], последнее обращение 15.10.2016&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Реализация алгоритма на POSTGRESQL &amp;lt;ref&amp;gt;[http://num-meth.srcc.msu.ru/zhurnal/tom_2012/pdf/v13r207.pdf Реализация алгоритма Fuzzy C-means на POSTGRESQL], последнее обращение 15.10.2016&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en:Parallel Fuzzy c-Means Clustering]]&lt;/div&gt;</summary>
		<author><name>Illusive mike</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:Nikmedoed&amp;diff=18174</id>
		<title>Обсуждение участника:Nikmedoed</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:Nikmedoed&amp;diff=18174"/>
		<updated>2016-11-18T15:20:14Z</updated>

		<summary type="html">&lt;p&gt;Illusive mike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Статья [[Участник:Nikmedoed/Нечеткий алгоритм С-средних (Fuzzy C-means)]] =&lt;br /&gt;
* не указан вклад каждого автора [[Участник:Coctic|Coctic]] ([[Обсуждение участника:Coctic|обсуждение]]) 13:01, 25 октября 2016 (MSK)&lt;br /&gt;
** Могли бы вы подсказать в каком формате это сделать? Просто общее сообщение, либо в каждом пункте указать?&lt;br /&gt;
*** В начале написать &amp;quot;Авторы: Автор1 - раздел 1, Автор2 - раздел 2&amp;quot;. Ну или что-то в том духе. [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 18:01, 28 октября 2016 (MSK)&lt;br /&gt;
:::: Исправлено [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 13:32, 31 октября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
* п. 1.2 приведен набор формул, однако отсутствует пояснения, как эти формулы складываются в алгоритм [[Участник:Coctic|Coctic]] ([[Обсуждение участника:Coctic|обсуждение]]) 13:01, 25 октября 2016 (MSK)&lt;br /&gt;
** П. 1.2 расширен в соответствии с замечанием. Ожидаю отзыв. [[Участник:Illusive_mike|Дворецкий М.С.]] ([[Обсуждение участника:Illusive_mike|обсуждение]]) 15:46, 25 октября 2016 (MSK)&lt;br /&gt;
::: Исправлено [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 13:32, 31 октября 2016 (MSK)&lt;br /&gt;
----------------&lt;br /&gt;
* п. 2.4. проведены исследования масштабируемости одной итерации. Исследование масштабируемости реализации в целом отсутствует [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 10:27, 17 ноября 2016 (MSK)&lt;br /&gt;
** Добавлено в статью: &amp;quot;Алгоритм обладает плохо исследованной сходимостью, но объем вычислений и итераций не зависит от значений данных, поэтому данное исследование масштабируемости было произведено для единичной итерации.&amp;quot;&lt;br /&gt;
** Принято [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 12:41, 18 ноября 2016 (MSK)&lt;br /&gt;
* п. 2.4. Рис. 2 приведен график зависимости эффективности от параметров задачи. Не указано, о каком виде эффективности идет речь. Значение эффективности в 100% в реальности встречается очень редко, надо в тексте пояснить, почему такой хороший результат. [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 10:27, 17 ноября 2016 (MSK)&lt;br /&gt;
** Добавили пояснение, что это график временной эффективности&lt;br /&gt;
** Что такое временная эффективность? В [[Глоссарий|глоссарии]] такой нет. [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 12:41, 18 ноября 2016 (MSK)&lt;br /&gt;
*** Изменено на термин из глоссария - эффективность распараллеливания.&lt;br /&gt;
** Добавили пояснение про причину высокой временной эффективности&lt;br /&gt;
** Принято [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 16:40, 18 ноября 2016 (MSK)&lt;br /&gt;
* п. 2.4. &#039;&#039;Для большинства экспериментов эффективность находится в пределах 100±3%.&#039;&#039;. Как эффективность может быть больше 100%? [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 10:27, 17 ноября 2016 (MSK)&lt;br /&gt;
** Сверхлинейное ускорение&lt;br /&gt;
** [https://www.dropbox.com/s/2ijzr6g8mhrftts/%D0%B8%D1%82%D0%BE%D0%B3%D0%B8%20%D1%82%D0%B5%D1%81%D1%82%D0%B0.xlsx?dl=0 Ссылка на расчёты]&lt;br /&gt;
** Доступная нам система профилировки недостаточна, чтобы найти причину сверхлинейного ускорения точно, поэтому мы не упомянули её прямым текстом&lt;br /&gt;
** Сначала надо разобраться, какая эффективность имеется в виду. [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 12:41, 18 ноября 2016 (MSK)&lt;br /&gt;
** Принято [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 16:40, 18 ноября 2016 (MSK)&lt;br /&gt;
* П. 2.4. Необходимо добавить описание ключей компилятора, особенностей запуска (раздел, используемые вычислительные узлы и т.п. информация, достаточная для воспроизведения данных). [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 16:40, 18 ноября 2016 (MSK)&lt;br /&gt;
** Создана новая ветка в проекте на GitHub, содержащем код реализации. В этой ветке добавлен файл readme, содержащий требуемую информацию. Ссылка в статье перенаправлена на эту ветку.&lt;/div&gt;</summary>
		<author><name>Illusive mike</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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=18173</id>
		<title>Участник:Nikmedoed/Нечеткий алгоритм С-средних (Fuzzy 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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=18173"/>
		<updated>2016-11-18T15:20:12Z</updated>

		<summary type="html">&lt;p&gt;Illusive mike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нечеткий алгоритм С-средних (Fuzzy C-means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(c^2 MI + cMnI), (I&amp;lt;/math&amp;gt; - число итераций, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - число точек, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - размерность точек (свойств на объект)&amp;lt;math&amp;gt;)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(c^2 I + cnI)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O( M )&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Nikmedoed|Н.А. Муромцев]] - перенос в вики, раздел 2, картинки, [[Участник:illusive_mike|М.С. Дворецкий]] - раздел 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Нечеткий алгоритм С-средних&#039;&#039;&#039; (&#039;&#039;Fuzzy C-means&#039;&#039;) - позволяет получить нечёткую кластеризацию больших наборов числовых данных, что позволяет корректно определять объекты на границах кластеров. Однако, выполнение данного алгоритма требует серьёзных вычислительных ресурсов, а также изначального задания количества кластеров. Кроме того, может возникнуть неоднозначность с объектами, удалёнными от центров всех кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм кластеризации Fuzzy C-Means (FCM) был предложен Дж. Данном в 1973 году &amp;lt;ref&amp;gt;Dunn, J.C.: A Fuzzy Relative of the ISODATA Process and Its Use in Detecting Compact Well-Separated Clusters. Journal of Cybernetics. 3 (1973): 32–57&amp;lt;/ref&amp;gt; и доработан Дж. Бездеком в 1981 году &amp;lt;ref&amp;gt;Bezdek, J.C.: Pattern Recognition with Fuzzy Objective Function Algorithms. Plenum Press, New York (1981). ISBN 0-306-40671-3&amp;lt;/ref&amp;gt;. В отличие от большинства существующих алгоритмов кластеризации, данный алгоритм является нечётким – каждый из объектов не входит однозначно в какой-либо кластер, а принадлежит всем кластерам с различными степенями принадлежности. Это даёт преимущества в качестве разбиения в случаях, когда кластеры находятся близко друг к другу, и большое число точек находится на их границах. Однако ценой такой нечёткости служат большие вычислительные затраты, чем у таких чётких алгоритмов, как [[Hard C-Means]] и [[K-Means]], при сохранении таких их недостатков, как априорное определение числа кластеров и отсутствие гарантии глобальной оптимальности результата.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Исходные данные: массив объектов &amp;lt;math&amp;gt;{X_k}\in{\R^n}, k=\overline{1,M}&amp;lt;/math&amp;gt;, число кластеров c, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица разбиения &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;M\times c&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;), центры кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, расстояния &amp;lt;math&amp;gt;D_{ki}&amp;lt;/math&amp;gt; между объектами и центрами кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода (вычисляются последовательно на каждой итерации):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Уточнение центров кластеров по степеням принадлежности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;V_i=\frac{\sum^{M}_{k=1} {\mu^m_{ki} * X_k}}{\sum^{M}_{k=1} {\mu^m_{ki}}},i=\overline{1,c}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
2. Расчёт расстояний между новыми центрами кластеров и точками данных&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
3. Пересчёт степеней принадлежности объектов кластерам&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} \left ( {\frac{D_{ki}}{D_{kj}}} \right ) }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждой итерации алгоритма происходит уточнение элементов матрицы &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Выходом алгоритма служит матрица &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, к которой алгоритм сходится. Факт того, что алгоритм сошёлся, устанавливается проверкой вида &amp;lt;math&amp;gt;\max_{k = \overline{1,M},i = \overline{1,c}} {( \left | \mu_{ki} - \mu_{ki}^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;  либо  &amp;lt;math&amp;gt;\max_{i = \overline{1,c}} {( \left | V_i - V_i^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mu_{ki}^* (V_i^*)&amp;lt;/math&amp;gt; – значение &amp;lt;math&amp;gt;\mu_{ki}(V_i)&amp;lt;/math&amp;gt;, вычисленное на предыдущей итерации.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Вычислительное ядро алгоритма Fuzzy C-Means составляют шаги вычисления центров кластеров, расстояний между ними и точками данных и в особенности пересчёта матрицы степеней принадлежности точек данных.&lt;br /&gt;
&lt;br /&gt;
При реальном вычислении некоторые повторяющиеся вычисления могут быть устранены. Так, для шага вычисления центров кластеров величины &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; могут вычисляться однократно и умножаться на &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt; при включении в сумму, записанную в числителе. Для шага вычисления расстояний между центрами кластеров и точками, операция взятия квадратного корня не является обязательной, так как в дальнейшем на шаге вычисления степеней принадлежности можно непосредственно использовать квадраты этих расстояний, и сумма в знаменателе будет приобретать вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum^{c}_{j=1} {\left ( \frac{D_{ki} ^ {2}}{D_{kj} ^ {2}} \right )}^{{1}/{m-1}}&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;
Инициализация происходит случайным заполнением матрицы принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; с соблюдением условия нормировки &amp;lt;math&amp;gt;\sum_{i=1}^c {\mu_{ki} =1}&amp;lt;/math&amp;gt; и переходом к шагу 1, либо случайным определением центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt; и переходом к шагу 2.&lt;br /&gt;
&lt;br /&gt;
Далее осуществляются итерации следующего вида:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;V_i=\frac{\sum_{k=1}^{M} {\mu_{ki}^m * X_k}}{\sum_{k=1}^{M} {\mu_{ki}^m} },i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} {\left ( \frac{D_{ki}}{D_{kj}} \right )} }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конце каждой итерации проверяется условие останова вида &amp;lt;math&amp;gt;\max_{k = \overline{1,M},i = \overline{1,c}} {( \left | \mu_{ki} - \mu_{ki}^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, либо &amp;lt;math&amp;gt;\max_{i = \overline{1,c}} {( \left | V_i - V_i^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mu_{ki}^* (V_i^*)&amp;lt;/math&amp;gt; – значение &amp;lt;math&amp;gt;\mu_{ki}(V_i)&amp;lt;/math&amp;gt;, вычисленное на предыдущей итерации. Если условие не выполнено, осуществляется переход к шагу 1.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
При кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; объектов данных, представленных точками в &amp;lt;math&amp;gt;\R^n&amp;lt;/math&amp;gt;, на &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; кластеров, алгоритм Fuzzy C-Means в последовательном варианте имеет вычислительную сложность – &amp;lt;math&amp;gt;O(c^2 MI+cMnI)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; – число итераций. Если считать размерность данных &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; малой, то эта сложность сводится к &amp;lt;math&amp;gt;O(c^2 MI)&amp;lt;/math&amp;gt;. Основной частью алгоритма в этом случае является пересчёт матрицы принадлежностей, требующий вычисления &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt; сумм из &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; слагаемых на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Приведём граф единичной итерации алгоритма в параллельном оптимизированном варианте (метод распараллеливания взят в &amp;lt;ref&amp;gt;Kwok, T., Smith, K.,&lt;br /&gt;
Lozano, S., Taniar, D.: [http://num-meth.srcc.msu.ru/zhurnal/tom_2012/pdf/v13r207.pdf Parallel Fuzzy c-Means Clustering for Large Data Sets], последнее обращение 25.10.2016&amp;lt;/ref&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
[[File:C-means_paralle_graph.png|thumb|upright=2.5|frame|center|alt=Paralel Fuzzy C-Means|Каждая вершина данного графа соответствует операциям из алгоритма, указанным при помощи указанных формул. Каждый из p столбцов соответствует работе одного из процессов. Пометки справа указывают число повторений каждого узла в ходе одной итерации.]]&lt;br /&gt;
&lt;br /&gt;
Раздел 1.8 уточняет, соответствуют ли эти повторения однотипным ярусам или точкам данных, вычисления для которых можно распараллелить и далее.&lt;br /&gt;
&lt;br /&gt;
Каждый процесс обладает следующими данными:&lt;br /&gt;
* координатами точек данных &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p}+1)}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;rnk&amp;lt;/math&amp;gt; – номер процесса,&lt;br /&gt;
* значениями &amp;lt;math&amp;gt;\mu_{ki}&amp;lt;/math&amp;gt; степени принадлежности для своих точек (&amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p} +1)}, i=\overline{1,c}&amp;lt;/math&amp;gt;),&lt;br /&gt;
* координатами центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=\overline{1,c}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Суммы &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m X_k}&amp;lt;/math&amp;gt; вычисляются одновременно, поэтому значения &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; вычисляются по одному разу за итерацию. Таким образом, второй ярус операций на рисунке на деле не содержит операций возведения в степень.&lt;br /&gt;
За счёт линейности большинства выражений относительно данных по точкам, процессы взаимодействуют только при редукции сумм, составляющих &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;. Всё остальное время каждый процессор работает только со своими &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точками. Это обеспечивает применимость алгоритма для больших &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
При распараллеливании по точкам исходных данных и условии останову по малому изменению степеней принадлежности выполнение одной итерации алгоритма FCM может быть разделено на следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм знаменателя (по &amp;lt;math&amp;gt;\frac{M}{p}-1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; операций возведения в степень на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм числителя (по &amp;lt;math&amp;gt;\frac{M}{p} -1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; умножений на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; редукции сумм и передач значений &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt; процессам (получение &amp;lt;math&amp;gt;c(n+1)&amp;lt;/math&amp;gt; значений, &amp;lt;math&amp;gt;cn&amp;lt;/math&amp;gt; делений),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&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; умножений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов вычисления степеней принадлежности точек (по &amp;lt;math&amp;gt;c+1&amp;lt;/math&amp;gt; делений, c возведений в степень, &amp;lt;math&amp;gt;c-1&amp;lt;/math&amp;gt; сложений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* до &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов проверки условий останова (по &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; вычитанию, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; сравнению), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; редукция для обмена статусом завершения.&lt;br /&gt;
Таким образом, при распараллеливании по точкам исходных данных при условии наличия в каждом узле достаточного объёма памяти для хранения всего массива координат центров кластеров высота и ширина ЯПФ алгоритма FCM равны соответственно &amp;lt;math&amp;gt;O(c^2 I+cnI)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: массив векторов &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt;, число кластеров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt; для входных векторов, 3 вспомогательных параметра.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;). Условие нормировки: &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
В случае неограниченного распараллеливания по точкам данных (1 процесс на точку), отношение последовательной сложности алгоритма к параллельной пропорционально &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; задаёт степень «размытости» кластеров. В отсутствие априорных данных его обычно берут равным 2. В предельном случае сведения параметра &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; к значению 1, кластеры становятся чёткими и алгоритм вырождается в алгоритм кластеризации K-Means.&lt;br /&gt;
&lt;br /&gt;
Алгоритм недетерминирован, начальное положение кластеров задаётся случайно либо явно, либо опосредованно (через матрицу принадлежности). Алгоритм сходится к локальному экстремуму &amp;lt;ref&amp;gt;Höppner, F., Klawonn, F.: [https://public.fh wolfenbuettel.de/~klawonn/Papers/hoeppnerklawonntfs03.pdf A Contribution to Convergence Theory of Fuzzy c-Means and Derivatives], Дата последнего обращения: 13.10.2016&amp;lt;/ref&amp;gt; и, таким образом, не гарантирует оптимальный результат при случайном выборе начальных значений.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
[[File:График.png|thumb|upright=2.5|frame|right|alt=Paralel Fuzzy C-Means time to iteration|График зависимости времени выполнения итерации параллельного нечеткого алгоритма С-средних (Fuzzy C-means) от количества процессоров и количества кластеризуемых вершин]]&lt;br /&gt;
&lt;br /&gt;
[[File:Effect_parallel_fuzzy_c-means.png|thumb|upright=2.5|frame|right|alt=Paralel Fuzzy C-Means efficiency|График эффективности распараллеливания нечеткого алгоритма С-средних (Fuzzy C-means) в зависимости от количества процессоров и количества кластеризуемых вершин.]]&lt;br /&gt;
&lt;br /&gt;
Исследование проведено на суперкомпьютере IBM Blue Gene/P&amp;lt;ref&amp;gt;[http://hpc.cs.msu.ru/bgp Описание вычислительного комплекса IBM Blue Gene/P]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Для исследования была использована последовательная реализация алгоритма и реализован её [https://github.com/IllusiveMike/Parallel-Fuzzy-C-means/tree/patch-1 параллельный вариант]&amp;lt;ref&amp;gt;[https://github.com/IllusiveMike/Parallel-Fuzzy-C-means/tree/patch-1 Параллельная реализация алгоритма Fuzzy C-Means]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Алгоритм обладает плохо исследованной сходимостью, но объем вычислений на итерации не зависит от значений данных, поэтому данное исследование масштабируемости было произведено для единичной итерации.&lt;br /&gt;
&lt;br /&gt;
Для упрощения экспериментов было решено использовать количество вершин для кластеризации и количество процессов равное степени двойки, поэтому для каждого эксперимента были выбраны значения:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^v, v=\overline{0,9}&amp;lt;/math&amp;gt;, для количества процессоров;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^w, w=\overline{10,20}&amp;lt;/math&amp;gt;, для количества кластеризуемых вершин.&lt;br /&gt;
&lt;br /&gt;
Для одного набора значений проводилось 4 эксперимента и результаты усреднялись. При повторных запусках экспериментов значения выходили те же самые.&lt;br /&gt;
&lt;br /&gt;
Полученные результаты говорят о хорошей масштабируемости реализации алгоритма. Для большинства экспериментов эффективность распараллеливания находится в пределах 100±3%. Высокая эффективность обуславливается тем, что данные равномерно распределены по процессорам и на каждой итерации требуется глобальная редукция всего &amp;lt;math&amp;gt;2c+1&amp;lt;/math&amp;gt; значений (&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значений числителей центроид кластеров, &amp;lt;math&amp;gt;c&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;
* пакет MATLAB &amp;lt;ref&amp;gt;[http://www.mathworks.com/help/fuzzy/fcm.html Документация пакета MATLAB, функция fcm], последнее обращение 15.10.2016&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Реализация алгоритма на POSTGRESQL &amp;lt;ref&amp;gt;[http://num-meth.srcc.msu.ru/zhurnal/tom_2012/pdf/v13r207.pdf Реализация алгоритма Fuzzy C-means на POSTGRESQL], последнее обращение 15.10.2016&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en:Parallel Fuzzy c-Means Clustering]]&lt;/div&gt;</summary>
		<author><name>Illusive mike</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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=18172</id>
		<title>Участник:Nikmedoed/Нечеткий алгоритм С-средних (Fuzzy 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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=18172"/>
		<updated>2016-11-18T15:17:02Z</updated>

		<summary type="html">&lt;p&gt;Illusive mike: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Нечеткий алгоритм С-средних (Fuzzy C-means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(c^2 MI + cMnI), (I&amp;lt;/math&amp;gt; - число итераций, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - число точек, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - размерность точек (свойств на объект)&amp;lt;math&amp;gt;)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(c^2 I + cnI)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O( M )&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Nikmedoed|Н.А. Муромцев]] - перенос в вики, раздел 2, картинки, [[Участник:illusive_mike|М.С. Дворецкий]] - раздел 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Нечеткий алгоритм С-средних&#039;&#039;&#039; (&#039;&#039;Fuzzy C-means&#039;&#039;) - позволяет получить нечёткую кластеризацию больших наборов числовых данных, что позволяет корректно определять объекты на границах кластеров. Однако, выполнение данного алгоритма требует серьёзных вычислительных ресурсов, а также изначального задания количества кластеров. Кроме того, может возникнуть неоднозначность с объектами, удалёнными от центров всех кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм кластеризации Fuzzy C-Means (FCM) был предложен Дж. Данном в 1973 году &amp;lt;ref&amp;gt;Dunn, J.C.: A Fuzzy Relative of the ISODATA Process and Its Use in Detecting Compact Well-Separated Clusters. Journal of Cybernetics. 3 (1973): 32–57&amp;lt;/ref&amp;gt; и доработан Дж. Бездеком в 1981 году &amp;lt;ref&amp;gt;Bezdek, J.C.: Pattern Recognition with Fuzzy Objective Function Algorithms. Plenum Press, New York (1981). ISBN 0-306-40671-3&amp;lt;/ref&amp;gt;. В отличие от большинства существующих алгоритмов кластеризации, данный алгоритм является нечётким – каждый из объектов не входит однозначно в какой-либо кластер, а принадлежит всем кластерам с различными степенями принадлежности. Это даёт преимущества в качестве разбиения в случаях, когда кластеры находятся близко друг к другу, и большое число точек находится на их границах. Однако ценой такой нечёткости служат большие вычислительные затраты, чем у таких чётких алгоритмов, как [[Hard C-Means]] и [[K-Means]], при сохранении таких их недостатков, как априорное определение числа кластеров и отсутствие гарантии глобальной оптимальности результата.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Исходные данные: массив объектов &amp;lt;math&amp;gt;{X_k}\in{\R^n}, k=\overline{1,M}&amp;lt;/math&amp;gt;, число кластеров c, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица разбиения &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;M\times c&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;), центры кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, расстояния &amp;lt;math&amp;gt;D_{ki}&amp;lt;/math&amp;gt; между объектами и центрами кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода (вычисляются последовательно на каждой итерации):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Уточнение центров кластеров по степеням принадлежности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;V_i=\frac{\sum^{M}_{k=1} {\mu^m_{ki} * X_k}}{\sum^{M}_{k=1} {\mu^m_{ki}}},i=\overline{1,c}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
2. Расчёт расстояний между новыми центрами кластеров и точками данных&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
3. Пересчёт степеней принадлежности объектов кластерам&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} \left ( {\frac{D_{ki}}{D_{kj}}} \right ) }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждой итерации алгоритма происходит уточнение элементов матрицы &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Выходом алгоритма служит матрица &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, к которой алгоритм сходится. Факт того, что алгоритм сошёлся, устанавливается проверкой вида &amp;lt;math&amp;gt;\max_{k = \overline{1,M},i = \overline{1,c}} {( \left | \mu_{ki} - \mu_{ki}^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;  либо  &amp;lt;math&amp;gt;\max_{i = \overline{1,c}} {( \left | V_i - V_i^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mu_{ki}^* (V_i^*)&amp;lt;/math&amp;gt; – значение &amp;lt;math&amp;gt;\mu_{ki}(V_i)&amp;lt;/math&amp;gt;, вычисленное на предыдущей итерации.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Вычислительное ядро алгоритма Fuzzy C-Means составляют шаги вычисления центров кластеров, расстояний между ними и точками данных и в особенности пересчёта матрицы степеней принадлежности точек данных.&lt;br /&gt;
&lt;br /&gt;
При реальном вычислении некоторые повторяющиеся вычисления могут быть устранены. Так, для шага вычисления центров кластеров величины &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; могут вычисляться однократно и умножаться на &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt; при включении в сумму, записанную в числителе. Для шага вычисления расстояний между центрами кластеров и точками, операция взятия квадратного корня не является обязательной, так как в дальнейшем на шаге вычисления степеней принадлежности можно непосредственно использовать квадраты этих расстояний, и сумма в знаменателе будет приобретать вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum^{c}_{j=1} {\left ( \frac{D_{ki} ^ {2}}{D_{kj} ^ {2}} \right )}^{{1}/{m-1}}&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;
Инициализация происходит случайным заполнением матрицы принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; с соблюдением условия нормировки &amp;lt;math&amp;gt;\sum_{i=1}^c {\mu_{ki} =1}&amp;lt;/math&amp;gt; и переходом к шагу 1, либо случайным определением центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt; и переходом к шагу 2.&lt;br /&gt;
&lt;br /&gt;
Далее осуществляются итерации следующего вида:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;V_i=\frac{\sum_{k=1}^{M} {\mu_{ki}^m * X_k}}{\sum_{k=1}^{M} {\mu_{ki}^m} },i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} {\left ( \frac{D_{ki}}{D_{kj}} \right )} }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конце каждой итерации проверяется условие останова вида &amp;lt;math&amp;gt;\max_{k = \overline{1,M},i = \overline{1,c}} {( \left | \mu_{ki} - \mu_{ki}^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, либо &amp;lt;math&amp;gt;\max_{i = \overline{1,c}} {( \left | V_i - V_i^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mu_{ki}^* (V_i^*)&amp;lt;/math&amp;gt; – значение &amp;lt;math&amp;gt;\mu_{ki}(V_i)&amp;lt;/math&amp;gt;, вычисленное на предыдущей итерации. Если условие не выполнено, осуществляется переход к шагу 1.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
При кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; объектов данных, представленных точками в &amp;lt;math&amp;gt;\R^n&amp;lt;/math&amp;gt;, на &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; кластеров, алгоритм Fuzzy C-Means в последовательном варианте имеет вычислительную сложность – &amp;lt;math&amp;gt;O(c^2 MI+cMnI)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; – число итераций. Если считать размерность данных &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; малой, то эта сложность сводится к &amp;lt;math&amp;gt;O(c^2 MI)&amp;lt;/math&amp;gt;. Основной частью алгоритма в этом случае является пересчёт матрицы принадлежностей, требующий вычисления &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt; сумм из &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; слагаемых на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Приведём граф единичной итерации алгоритма в параллельном оптимизированном варианте (метод распараллеливания взят в &amp;lt;ref&amp;gt;Kwok, T., Smith, K.,&lt;br /&gt;
Lozano, S., Taniar, D.: [http://num-meth.srcc.msu.ru/zhurnal/tom_2012/pdf/v13r207.pdf Parallel Fuzzy c-Means Clustering for Large Data Sets], последнее обращение 25.10.2016&amp;lt;/ref&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
[[File:C-means_paralle_graph.png|thumb|upright=2.5|frame|center|alt=Paralel Fuzzy C-Means|Каждая вершина данного графа соответствует операциям из алгоритма, указанным при помощи указанных формул. Каждый из p столбцов соответствует работе одного из процессов. Пометки справа указывают число повторений каждого узла в ходе одной итерации.]]&lt;br /&gt;
&lt;br /&gt;
Раздел 1.8 уточняет, соответствуют ли эти повторения однотипным ярусам или точкам данных, вычисления для которых можно распараллелить и далее.&lt;br /&gt;
&lt;br /&gt;
Каждый процесс обладает следующими данными:&lt;br /&gt;
* координатами точек данных &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p}+1)}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;rnk&amp;lt;/math&amp;gt; – номер процесса,&lt;br /&gt;
* значениями &amp;lt;math&amp;gt;\mu_{ki}&amp;lt;/math&amp;gt; степени принадлежности для своих точек (&amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p} +1)}, i=\overline{1,c}&amp;lt;/math&amp;gt;),&lt;br /&gt;
* координатами центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=\overline{1,c}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Суммы &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m X_k}&amp;lt;/math&amp;gt; вычисляются одновременно, поэтому значения &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; вычисляются по одному разу за итерацию. Таким образом, второй ярус операций на рисунке на деле не содержит операций возведения в степень.&lt;br /&gt;
За счёт линейности большинства выражений относительно данных по точкам, процессы взаимодействуют только при редукции сумм, составляющих &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;. Всё остальное время каждый процессор работает только со своими &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точками. Это обеспечивает применимость алгоритма для больших &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
При распараллеливании по точкам исходных данных и условии останову по малому изменению степеней принадлежности выполнение одной итерации алгоритма FCM может быть разделено на следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм знаменателя (по &amp;lt;math&amp;gt;\frac{M}{p}-1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; операций возведения в степень на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм числителя (по &amp;lt;math&amp;gt;\frac{M}{p} -1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; умножений на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; редукции сумм и передач значений &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt; процессам (получение &amp;lt;math&amp;gt;c(n+1)&amp;lt;/math&amp;gt; значений, &amp;lt;math&amp;gt;cn&amp;lt;/math&amp;gt; делений),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&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; умножений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов вычисления степеней принадлежности точек (по &amp;lt;math&amp;gt;c+1&amp;lt;/math&amp;gt; делений, c возведений в степень, &amp;lt;math&amp;gt;c-1&amp;lt;/math&amp;gt; сложений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* до &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов проверки условий останова (по &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; вычитанию, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; сравнению), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; редукция для обмена статусом завершения.&lt;br /&gt;
Таким образом, при распараллеливании по точкам исходных данных при условии наличия в каждом узле достаточного объёма памяти для хранения всего массива координат центров кластеров высота и ширина ЯПФ алгоритма FCM равны соответственно &amp;lt;math&amp;gt;O(c^2 I+cnI)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: массив векторов &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt;, число кластеров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt; для входных векторов, 3 вспомогательных параметра.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;). Условие нормировки: &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
В случае неограниченного распараллеливания по точкам данных (1 процесс на точку), отношение последовательной сложности алгоритма к параллельной пропорционально &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; задаёт степень «размытости» кластеров. В отсутствие априорных данных его обычно берут равным 2. В предельном случае сведения параметра &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; к значению 1, кластеры становятся чёткими и алгоритм вырождается в алгоритм кластеризации K-Means.&lt;br /&gt;
&lt;br /&gt;
Алгоритм недетерминирован, начальное положение кластеров задаётся случайно либо явно, либо опосредованно (через матрицу принадлежности). Алгоритм сходится к локальному экстремуму &amp;lt;ref&amp;gt;Höppner, F., Klawonn, F.: [https://public.fh wolfenbuettel.de/~klawonn/Papers/hoeppnerklawonntfs03.pdf A Contribution to Convergence Theory of Fuzzy c-Means and Derivatives], Дата последнего обращения: 13.10.2016&amp;lt;/ref&amp;gt; и, таким образом, не гарантирует оптимальный результат при случайном выборе начальных значений.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
[[File:График.png|thumb|upright=2.5|frame|right|alt=Paralel Fuzzy C-Means time to iteration|График зависимости времени выполнения итерации параллельного нечеткого алгоритма С-средних (Fuzzy C-means) от количества процессоров и количества кластеризуемых вершин]]&lt;br /&gt;
&lt;br /&gt;
[[File:Effect_parallel_fuzzy_c-means.png|thumb|upright=2.5|frame|right|alt=Paralel Fuzzy C-Means efficiency|График эффективности распараллеливания нечеткого алгоритма С-средних (Fuzzy C-means) в зависимости от количества процессоров и количества кластеризуемых вершин.]]&lt;br /&gt;
&lt;br /&gt;
Исследование проведено на суперкомпьютере IBM Blue Gene/P&amp;lt;ref&amp;gt;[http://hpc.cs.msu.ru/bgp Описание вычислительного комплекса IBM Blue Gene/P]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Для исследования была использована последовательная реализация алгоритма и реализован её [https://github.com/IllusiveMike/Parallel-Fuzzy-C-means/tree/patch-1 параллельный вариант]&amp;lt;ref&amp;gt;[https://github.com/IllusiveMike/Parallel-Fuzzy-C-means/tree/patch-1 Параллельная реализация алгоритма Fuzzy C-Means]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Алгоритм обладает плохо исследованной сходимостью, но объем вычислений на итерации не зависит от значений данных, поэтому данное исследование масштабируемости было произведено для единичной итерации.&lt;br /&gt;
&lt;br /&gt;
Для упрощения экспериментов было решено использовать количество вершин для кластеризации и количество процессов равное степени двойки, поэтому для каждого эксперимента были выбраны значения:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^v, v=\overline{0,9}&amp;lt;/math&amp;gt;, для количества процессоров;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^w, w=\overline{10,20}&amp;lt;/math&amp;gt;, для количества кластеризуемых вершин.&lt;br /&gt;
&lt;br /&gt;
Для одного набора значений проводилось 4 эксперимента и результаты усреднялись. При повторных запусках экспериментов значения выходили те же самые.&lt;br /&gt;
&lt;br /&gt;
Полученные результаты говорят о хорошей масштабируемости реализации алгоритма. Для большинства экспериментов эффективность распараллеливания находится в пределах 100±3%. Высокая эффективность обуславливается тем, что данные равномерно распределены по процессорам и на каждой итерации требуется глобальная редукция всего &amp;lt;math&amp;gt;2c+1&amp;lt;/math&amp;gt; значений (&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значений числителей центроид кластеров, &amp;lt;math&amp;gt;c&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;
* пакет MATLAB &amp;lt;ref&amp;gt;[http://www.mathworks.com/help/fuzzy/fcm.html Документация пакета MATLAB, функция fcm], последнее обращение 15.10.2016&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Реализация алгоритма на POSTGRESQL &amp;lt;ref&amp;gt;[http://num-meth.srcc.msu.ru/zhurnal/tom_2012/pdf/v13r207.pdf Реализация алгоритма Fuzzy C-means на POSTGRESQL], последнее обращение 15.10.2016&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en:Parallel Fuzzy c-Means Clustering]]&lt;/div&gt;</summary>
		<author><name>Illusive mike</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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=18134</id>
		<title>Участник:Nikmedoed/Нечеткий алгоритм С-средних (Fuzzy 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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=18134"/>
		<updated>2016-11-18T13:26:48Z</updated>

		<summary type="html">&lt;p&gt;Illusive mike: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нечеткий алгоритм С-средних (Fuzzy C-means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(c^2 MI + cMnI), (I&amp;lt;/math&amp;gt; - число итераций, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - число точек, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - размерность точек (свойств на объект)&amp;lt;math&amp;gt;)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(c^2 I + cnI)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O( M )&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Nikmedoed|Н.А. Муромцев]] - перенос в вики, раздел 2, картинки, [[Участник:illusive_mike|М.С. Дворецкий]] - раздел 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Нечеткий алгоритм С-средних&#039;&#039;&#039; (&#039;&#039;Fuzzy C-means&#039;&#039;) - позволяет получить нечёткую кластеризацию больших наборов числовых данных, что позволяет корректно определять объекты на границах кластеров. Однако, выполнение данного алгоритма требует серьёзных вычислительных ресурсов, а также изначального задания количества кластеров. Кроме того, может возникнуть неоднозначность с объектами, удалёнными от центров всех кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм кластеризации Fuzzy C-Means (FCM) был предложен Дж. Данном в 1973 году &amp;lt;ref&amp;gt;Dunn, J.C.: A Fuzzy Relative of the ISODATA Process and Its Use in Detecting Compact Well-Separated Clusters. Journal of Cybernetics. 3 (1973): 32–57&amp;lt;/ref&amp;gt; и доработан Дж. Бездеком в 1981 году &amp;lt;ref&amp;gt;Bezdek, J.C.: Pattern Recognition with Fuzzy Objective Function Algorithms. Plenum Press, New York (1981). ISBN 0-306-40671-3&amp;lt;/ref&amp;gt;. В отличие от большинства существующих алгоритмов кластеризации, данный алгоритм является нечётким – каждый из объектов не входит однозначно в какой-либо кластер, а принадлежит всем кластерам с различными степенями принадлежности. Это даёт преимущества в качестве разбиения в случаях, когда кластеры находятся близко друг к другу, и большое число точек находится на их границах. Однако ценой такой нечёткости служат большие вычислительные затраты, чем у таких чётких алгоритмов, как [[Hard C-Means]] и [[K-Means]], при сохранении таких их недостатков, как априорное определение числа кластеров и отсутствие гарантии глобальной оптимальности результата.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Исходные данные: массив объектов &amp;lt;math&amp;gt;{X_k}\in{\R^n}, k=\overline{1,M}&amp;lt;/math&amp;gt;, число кластеров c, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица разбиения &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;M\times c&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;), центры кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, расстояния &amp;lt;math&amp;gt;D_{ki}&amp;lt;/math&amp;gt; между объектами и центрами кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода (вычисляются последовательно на каждой итерации):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Уточнение центров кластеров по степеням принадлежности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;V_i=\frac{\sum^{M}_{k=1} {\mu^m_{ki} * X_k}}{\sum^{M}_{k=1} {\mu^m_{ki}}},i=\overline{1,c}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
2. Расчёт расстояний между новыми центрами кластеров и точками данных&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
3. Пересчёт степеней принадлежности объектов кластерам&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} \left ( {\frac{D_{ki}}{D_{kj}}} \right ) }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждой итерации алгоритма происходит уточнение элементов матрицы &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Выходом алгоритма служит матрица &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, к которой алгоритм сходится. Факт того, что алгоритм сошёлся, устанавливается проверкой вида &amp;lt;math&amp;gt;\max_{k = \overline{1,M},i = \overline{1,c}} {( \left | \mu_{ki} - \mu_{ki}^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;  либо  &amp;lt;math&amp;gt;\max_{i = \overline{1,c}} {( \left | V_i - V_i^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mu_{ki}^* (V_i^*)&amp;lt;/math&amp;gt; – значение &amp;lt;math&amp;gt;\mu_{ki}(V_i)&amp;lt;/math&amp;gt;, вычисленное на предыдущей итерации.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Вычислительное ядро алгоритма Fuzzy C-Means составляют шаги вычисления центров кластеров, расстояний между ними и точками данных и в особенности пересчёта матрицы степеней принадлежности точек данных.&lt;br /&gt;
&lt;br /&gt;
При реальном вычислении некоторые повторяющиеся вычисления могут быть устранены. Так, для шага вычисления центров кластеров величины &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; могут вычисляться однократно и умножаться на &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt; при включении в сумму, записанную в числителе. Для шага вычисления расстояний между центрами кластеров и точками, операция взятия квадратного корня не является обязательной, так как в дальнейшем на шаге вычисления степеней принадлежности можно непосредственно использовать квадраты этих расстояний, и сумма в знаменателе будет приобретать вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum^{c}_{j=1} {\left ( \frac{D_{ki} ^ {2}}{D_{kj} ^ {2}} \right )}^{{1}/{m-1}}&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;
Инициализация происходит случайным заполнением матрицы принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; с соблюдением условия нормировки &amp;lt;math&amp;gt;\sum_{i=1}^c {\mu_{ki} =1}&amp;lt;/math&amp;gt; и переходом к шагу 1, либо случайным определением центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt; и переходом к шагу 2.&lt;br /&gt;
&lt;br /&gt;
Далее осуществляются итерации следующего вида:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;V_i=\frac{\sum_{k=1}^{M} {\mu_{ki}^m * X_k}}{\sum_{k=1}^{M} {\mu_{ki}^m} },i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} {\left ( \frac{D_{ki}}{D_{kj}} \right )} }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конце каждой итерации проверяется условие останова вида &amp;lt;math&amp;gt;\max_{k = \overline{1,M},i = \overline{1,c}} {( \left | \mu_{ki} - \mu_{ki}^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, либо &amp;lt;math&amp;gt;\max_{i = \overline{1,c}} {( \left | V_i - V_i^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mu_{ki}^* (V_i^*)&amp;lt;/math&amp;gt; – значение &amp;lt;math&amp;gt;\mu_{ki}(V_i)&amp;lt;/math&amp;gt;, вычисленное на предыдущей итерации. Если условие не выполнено, осуществляется переход к шагу 1.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
При кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; объектов данных, представленных точками в &amp;lt;math&amp;gt;\R^n&amp;lt;/math&amp;gt;, на &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; кластеров, алгоритм Fuzzy C-Means в последовательном варианте имеет вычислительную сложность – &amp;lt;math&amp;gt;O(c^2 MI+cMnI)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; – число итераций. Если считать размерность данных &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; малой, то эта сложность сводится к &amp;lt;math&amp;gt;O(c^2 MI)&amp;lt;/math&amp;gt;. Основной частью алгоритма в этом случае является пересчёт матрицы принадлежностей, требующий вычисления &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt; сумм из &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; слагаемых на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Приведём граф единичной итерации алгоритма в параллельном оптимизированном варианте (метод распараллеливания взят в &amp;lt;ref&amp;gt;Kwok, T., Smith, K.,&lt;br /&gt;
Lozano, S., Taniar, D.: [http://num-meth.srcc.msu.ru/zhurnal/tom_2012/pdf/v13r207.pdf Parallel Fuzzy c-Means Clustering for Large Data Sets], последнее обращение 25.10.2016&amp;lt;/ref&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
[[File:C-means_paralle_graph.png|thumb|upright=2.5|frame|center|alt=Paralel Fuzzy C-Means|Каждая вершина данного графа соответствует операциям из алгоритма, указанным при помощи указанных формул. Каждый из p столбцов соответствует работе одного из процессов. Пометки справа указывают число повторений каждого узла в ходе одной итерации.]]&lt;br /&gt;
&lt;br /&gt;
Раздел 1.8 уточняет, соответствуют ли эти повторения однотипным ярусам или точкам данных, вычисления для которых можно распараллелить и далее.&lt;br /&gt;
&lt;br /&gt;
Каждый процесс обладает следующими данными:&lt;br /&gt;
* координатами точек данных &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p}+1)}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;rnk&amp;lt;/math&amp;gt; – номер процесса,&lt;br /&gt;
* значениями &amp;lt;math&amp;gt;\mu_{ki}&amp;lt;/math&amp;gt; степени принадлежности для своих точек (&amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p} +1)}, i=\overline{1,c}&amp;lt;/math&amp;gt;),&lt;br /&gt;
* координатами центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=\overline{1,c}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Суммы &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m X_k}&amp;lt;/math&amp;gt; вычисляются одновременно, поэтому значения &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; вычисляются по одному разу за итерацию. Таким образом, второй ярус операций на рисунке на деле не содержит операций возведения в степень.&lt;br /&gt;
За счёт линейности большинства выражений относительно данных по точкам, процессы взаимодействуют только при редукции сумм, составляющих &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;. Всё остальное время каждый процессор работает только со своими &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точками. Это обеспечивает применимость алгоритма для больших &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
При распараллеливании по точкам исходных данных и условии останову по малому изменению степеней принадлежности выполнение одной итерации алгоритма FCM может быть разделено на следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм знаменателя (по &amp;lt;math&amp;gt;\frac{M}{p}-1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; операций возведения в степень на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм числителя (по &amp;lt;math&amp;gt;\frac{M}{p} -1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; умножений на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; редукции сумм и передач значений &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt; процессам (получение &amp;lt;math&amp;gt;c(n+1)&amp;lt;/math&amp;gt; значений, &amp;lt;math&amp;gt;cn&amp;lt;/math&amp;gt; делений),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&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; умножений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов вычисления степеней принадлежности точек (по &amp;lt;math&amp;gt;c+1&amp;lt;/math&amp;gt; делений, c возведений в степень, &amp;lt;math&amp;gt;c-1&amp;lt;/math&amp;gt; сложений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* до &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов проверки условий останова (по &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; вычитанию, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; сравнению), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; редукция для обмена статусом завершения.&lt;br /&gt;
Таким образом, при распараллеливании по точкам исходных данных при условии наличия в каждом узле достаточного объёма памяти для хранения всего массива координат центров кластеров высота и ширина ЯПФ алгоритма FCM равны соответственно &amp;lt;math&amp;gt;O(c^2 I+cnI)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: массив векторов &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt;, число кластеров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt; для входных векторов, 3 вспомогательных параметра.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;). Условие нормировки: &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
В случае неограниченного распараллеливания по точкам данных (1 процесс на точку), отношение последовательной сложности алгоритма к параллельной пропорционально &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; задаёт степень «размытости» кластеров. В отсутствие априорных данных его обычно берут равным 2. В предельном случае сведения параметра &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; к значению 1, кластеры становятся чёткими и алгоритм вырождается в алгоритм кластеризации K-Means.&lt;br /&gt;
&lt;br /&gt;
Алгоритм недетерминирован, начальное положение кластеров задаётся случайно либо явно, либо опосредованно (через матрицу принадлежности). Алгоритм сходится к локальному экстремуму &amp;lt;ref&amp;gt;Höppner, F., Klawonn, F.: [https://public.fh wolfenbuettel.de/~klawonn/Papers/hoeppnerklawonntfs03.pdf A Contribution to Convergence Theory of Fuzzy c-Means and Derivatives], Дата последнего обращения: 13.10.2016&amp;lt;/ref&amp;gt; и, таким образом, не гарантирует оптимальный результат при случайном выборе начальных значений.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
[[File:График.png|thumb|upright=2.5|frame|right|alt=Paralel Fuzzy C-Means time to iteration|График зависимости времени выполнения итерации параллельного нечеткого алгоритма С-средних (Fuzzy C-means) от количества процессоров и количества кластеризуемых вершин]]&lt;br /&gt;
&lt;br /&gt;
[[File:Effect_parallel_fuzzy_c-means.png|thumb|upright=2.5|frame|right|alt=Paralel Fuzzy C-Means efficiency|График эффективности распараллеливания нечеткого алгоритма С-средних (Fuzzy C-means) в зависимости от количества процессоров и количества кластеризуемых вершин.]]&lt;br /&gt;
&lt;br /&gt;
Исследование проведено на суперкомпьютере IBM Blue Gene/P&amp;lt;ref&amp;gt;[http://hpc.cs.msu.ru/bgp Описание вычислительного комплекса IBM Blue Gene/P]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Для исследования была использована последовательная реализация алгоритма и реализован её [https://github.com/nikmedoed/Parallel-Fuzzy-C-means параллельный вариант]&amp;lt;ref&amp;gt;[https://github.com/nikmedoed/Parallel-Fuzzy-C-means Параллельная реализация алгоритма Fuzzy C-Means]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Алгоритм обладает плохо исследованной сходимостью, но объем вычислений на итерации не зависит от значений данных, поэтому данное исследование масштабируемости было произведено для единичной итерации.&lt;br /&gt;
&lt;br /&gt;
Для упрощения экспериментов было решено использовать количество вершин для кластеризации и количество процессов равное степени двойки, поэтому для каждого эксперимента были выбраны значения:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^v, v=\overline{0,9}&amp;lt;/math&amp;gt;, для количества процессоров;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^w, w=\overline{10,20}&amp;lt;/math&amp;gt;, для количества кластеризуемых вершин.&lt;br /&gt;
&lt;br /&gt;
Для одного набора значений проводилось 4 эксперимента и результаты усреднялись. При повторных запусках экспериментов значения выходили те же самые.&lt;br /&gt;
&lt;br /&gt;
Полученные результаты говорят о хорошей масштабируемости реализации алгоритма. Для большинства экспериментов эффективность распараллеливания находится в пределах 100±3%. Высокая эффективность обуславливается тем, что данные равномерно распределены по процессорам и на каждой итерации требуется глобальная редукция всего &amp;lt;math&amp;gt;2c+1&amp;lt;/math&amp;gt; значений (&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значений числителей центроид кластеров, &amp;lt;math&amp;gt;c&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;
* пакет MATLAB &amp;lt;ref&amp;gt;[http://www.mathworks.com/help/fuzzy/fcm.html Документация пакета MATLAB, функция fcm], последнее обращение 15.10.2016&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Реализация алгоритма на POSTGRESQL &amp;lt;ref&amp;gt;[http://num-meth.srcc.msu.ru/zhurnal/tom_2012/pdf/v13r207.pdf Реализация алгоритма Fuzzy C-means на POSTGRESQL], последнее обращение 15.10.2016&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en:Parallel Fuzzy c-Means Clustering]]&lt;/div&gt;</summary>
		<author><name>Illusive mike</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:Nikmedoed&amp;diff=18133</id>
		<title>Обсуждение участника:Nikmedoed</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:Nikmedoed&amp;diff=18133"/>
		<updated>2016-11-18T13:21:06Z</updated>

		<summary type="html">&lt;p&gt;Illusive mike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Статья [[Участник:Nikmedoed/Нечеткий алгоритм С-средних (Fuzzy C-means)]] =&lt;br /&gt;
* не указан вклад каждого автора [[Участник:Coctic|Coctic]] ([[Обсуждение участника:Coctic|обсуждение]]) 13:01, 25 октября 2016 (MSK)&lt;br /&gt;
** Могли бы вы подсказать в каком формате это сделать? Просто общее сообщение, либо в каждом пункте указать?&lt;br /&gt;
*** В начале написать &amp;quot;Авторы: Автор1 - раздел 1, Автор2 - раздел 2&amp;quot;. Ну или что-то в том духе. [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 18:01, 28 октября 2016 (MSK)&lt;br /&gt;
:::: Исправлено [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 13:32, 31 октября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
* п. 1.2 приведен набор формул, однако отсутствует пояснения, как эти формулы складываются в алгоритм [[Участник:Coctic|Coctic]] ([[Обсуждение участника:Coctic|обсуждение]]) 13:01, 25 октября 2016 (MSK)&lt;br /&gt;
** П. 1.2 расширен в соответствии с замечанием. Ожидаю отзыв. [[Участник:Illusive_mike|Дворецкий М.С.]] ([[Обсуждение участника:Illusive_mike|обсуждение]]) 15:46, 25 октября 2016 (MSK)&lt;br /&gt;
::: Исправлено [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 13:32, 31 октября 2016 (MSK)&lt;br /&gt;
----------------&lt;br /&gt;
* п. 2.4. проведены исследования масштабируемости одной итерации. Исследование масштабируемости реализации в целом отсутствует [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 10:27, 17 ноября 2016 (MSK)&lt;br /&gt;
** Добавлено в статью: &amp;quot;Алгоритм обладает плохо исследованной сходимостью, но объем вычислений и итераций не зависит от значений данных, поэтому данное исследование масштабируемости было произведено для единичной итерации.&amp;quot;&lt;br /&gt;
** Принято [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 12:41, 18 ноября 2016 (MSK)&lt;br /&gt;
* п. 2.4. Рис. 2 приведен график зависимости эффективности от параметров задачи. Не указано, о каком виде эффективности идет речь. Значение эффективности в 100% в реальности встречается очень редко, надо в тексте пояснить, почему такой хороший результат. [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 10:27, 17 ноября 2016 (MSK)&lt;br /&gt;
** Добавили пояснение, что это график временной эффективности&lt;br /&gt;
** Что такое временная эффективность? В [[Глоссарий|глоссарии]] такой нет. [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 12:41, 18 ноября 2016 (MSK)&lt;br /&gt;
*** Изменено на термин из глоссария - эффективность распараллеливания.&lt;br /&gt;
** Добавили пояснение про причину высокой временной эффективности&lt;br /&gt;
* п. 2.4. &#039;&#039;Для большинства экспериментов эффективность находится в пределах 100±3%.&#039;&#039;. Как эффективность может быть больше 100%? [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 10:27, 17 ноября 2016 (MSK)&lt;br /&gt;
** Сверхлинейное ускорение&lt;br /&gt;
** [https://www.dropbox.com/s/2ijzr6g8mhrftts/%D0%B8%D1%82%D0%BE%D0%B3%D0%B8%20%D1%82%D0%B5%D1%81%D1%82%D0%B0.xlsx?dl=0 Ссылка на расчёты]&lt;br /&gt;
** Доступная нам система профилировки недостаточна, чтобы найти причину сверхлинейного ускорения точно, поэтому мы не упомянули её прямым текстом&lt;br /&gt;
** Сначала надо разобраться, какая эффективность имеется в виду. [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 12:41, 18 ноября 2016 (MSK)&lt;/div&gt;</summary>
		<author><name>Illusive mike</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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=18132</id>
		<title>Участник:Nikmedoed/Нечеткий алгоритм С-средних (Fuzzy 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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=18132"/>
		<updated>2016-11-18T13:20:17Z</updated>

		<summary type="html">&lt;p&gt;Illusive mike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нечеткий алгоритм С-средних (Fuzzy C-means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(c^2 MI + cMnI), (I&amp;lt;/math&amp;gt; - число итераций, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - число точек, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - размерность точек (свойств на объект)&amp;lt;math&amp;gt;)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(c^2 I + cnI)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O( M )&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Nikmedoed|Н.А. Муромцев]] - перенос в вики, раздел 2, картинки, [[Участник:illusive_mike|М.С. Дворецкий]] - раздел 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Нечеткий алгоритм С-средних&#039;&#039;&#039; (&#039;&#039;Fuzzy C-means&#039;&#039;) - позволяет получить нечёткую кластеризацию больших наборов числовых данных, что позволяет корректно определять объекты на границах кластеров. Однако, выполнение данного алгоритма требует серьёзных вычислительных ресурсов, а также изначального задания количества кластеров. Кроме того, может возникнуть неоднозначность с объектами, удалёнными от центров всех кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм кластеризации Fuzzy C-Means (FCM) был предложен Дж. Данном в 1973 году &amp;lt;ref&amp;gt;Dunn, J.C.: A Fuzzy Relative of the ISODATA Process and Its Use in Detecting Compact Well-Separated Clusters. Journal of Cybernetics. 3 (1973): 32–57&amp;lt;/ref&amp;gt; и доработан Дж. Бездеком в 1981 году &amp;lt;ref&amp;gt;Bezdek, J.C.: Pattern Recognition with Fuzzy Objective Function Algorithms. Plenum Press, New York (1981). ISBN 0-306-40671-3&amp;lt;/ref&amp;gt;. В отличие от большинства существующих алгоритмов кластеризации, данный алгоритм является нечётким – каждый из объектов не входит однозначно в какой-либо кластер, а принадлежит всем кластерам с различными степенями принадлежности. Это даёт преимущества в качестве разбиения в случаях, когда кластеры находятся близко друг к другу, и большое число точек находится на их границах. Однако ценой такой нечёткости служат большие вычислительные затраты, чем у таких чётких алгоритмов, как [[Hard C-Means]] и [[K-Means]], при сохранении таких их недостатков, как априорное определение числа кластеров и отсутствие гарантии глобальной оптимальности результата.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Исходные данные: массив объектов &amp;lt;math&amp;gt;{X_k}\in{\R^n}, k=\overline{1,M}&amp;lt;/math&amp;gt;, число кластеров c, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица разбиения &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;M\times c&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;), центры кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, расстояния &amp;lt;math&amp;gt;D_{ki}&amp;lt;/math&amp;gt; между объектами и центрами кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода (вычисляются последовательно на каждой итерации):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Уточнение центров кластеров по степеням принадлежности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;V_i=\frac{\sum^{M}_{k=1} {\mu^m_{ki} * X_k}}{\sum^{M}_{k=1} {\mu^m_{ki}}},i=\overline{1,c}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
2. Расчёт расстояний между новыми центрами кластеров и точками данных&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
3. Пересчёт степеней принадлежности объектов кластерам&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} \left ( {\frac{D_{ki}}{D_{kj}}} \right ) }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждой итерации алгоритма происходит уточнение элементов матрицы &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Выходом алгоритма служит матрица &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, к которой алгоритм сходится. Факт того, что алгоритм сошёлся, устанавливается проверкой вида &amp;lt;math&amp;gt;\max_{k = \overline{1,M},i = \overline{1,c}} {( \left | \mu_{ki} - \mu_{ki}^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;  либо  &amp;lt;math&amp;gt;\max_{i = \overline{1,c}} {( \left | V_i - V_i^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mu_{ki}^* (V_i^*)&amp;lt;/math&amp;gt; – значение &amp;lt;math&amp;gt;\mu_{ki}(V_i)&amp;lt;/math&amp;gt;, вычисленное на предыдущей итерации.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Вычислительное ядро алгоритма Fuzzy C-Means составляют шаги вычисления центров кластеров, расстояний между ними и точками данных и в особенности пересчёта матрицы степеней принадлежности точек данных.&lt;br /&gt;
&lt;br /&gt;
При реальном вычислении некоторые повторяющиеся вычисления могут быть устранены. Так, для шага вычисления центров кластеров величины &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; могут вычисляться однократно и умножаться на &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt; при включении в сумму, записанную в числителе. Для шага вычисления расстояний между центрами кластеров и точками, операция взятия квадратного корня не является обязательной, так как в дальнейшем на шаге вычисления степеней принадлежности можно непосредственно использовать квадраты этих расстояний, и сумма в знаменателе будет приобретать вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum^{c}_{j=1} {\left ( \frac{D_{ki} ^ {2}}{D_{kj} ^ {2}} \right )}^{{1}/{m-1}}&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;
Инициализация происходит случайным заполнением матрицы принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; с соблюдением условия нормировки &amp;lt;math&amp;gt;\sum_{i=1}^c {\mu_{ki} =1}&amp;lt;/math&amp;gt; и переходом к шагу 1, либо случайным определением центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt; и переходом к шагу 2.&lt;br /&gt;
&lt;br /&gt;
Далее осуществляются итерации следующего вида:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;V_i=\frac{\sum_{k=1}^{M} {\mu_{ki}^m * X_k}}{\sum_{k=1}^{M} {\mu_{ki}^m} },i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} {\left ( \frac{D_{ki}}{D_{kj}} \right )} }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конце каждой итерации проверяется условие останова вида &amp;lt;math&amp;gt;\max_{k = \overline{1,M},i = \overline{1,c}} {( \left | \mu_{ki} - \mu_{ki}^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, либо &amp;lt;math&amp;gt;\max_{i = \overline{1,c}} {( \left | V_i - V_i^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mu_{ki}^* (V_i^*)&amp;lt;/math&amp;gt; – значение &amp;lt;math&amp;gt;\mu_{ki}(V_i)&amp;lt;/math&amp;gt;, вычисленное на предыдущей итерации. Если условие не выполнено, осуществляется переход к шагу 1.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
При кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; объектов данных, представленных точками в &amp;lt;math&amp;gt;\R^n&amp;lt;/math&amp;gt;, на &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; кластеров, алгоритм Fuzzy C-Means в последовательном варианте имеет вычислительную сложность – &amp;lt;math&amp;gt;O(c^2 MI+cMnI)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; – число итераций. Если считать размерность данных &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; малой, то эта сложность сводится к &amp;lt;math&amp;gt;O(c^2 MI)&amp;lt;/math&amp;gt;. Основной частью алгоритма в этом случае является пересчёт матрицы принадлежностей, требующий вычисления &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt; сумм из &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; слагаемых на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Приведём граф единичной итерации алгоритма в параллельном оптимизированном варианте (метод распараллеливания взят в &amp;lt;ref&amp;gt;Kwok, T., Smith, K.,&lt;br /&gt;
Lozano, S., Taniar, D.: [http://num-meth.srcc.msu.ru/zhurnal/tom_2012/pdf/v13r207.pdf Parallel Fuzzy c-Means Clustering for Large Data Sets], последнее обращение 25.10.2016&amp;lt;/ref&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
[[File:C-means_paralle_graph.png|thumb|upright=2.5|frame|center|alt=Paralel Fuzzy C-Means|Каждая вершина данного графа соответствует операциям из алгоритма, указанным при помощи указанных формул. Каждый из p столбцов соответствует работе одного из процессов. Пометки справа указывают число повторений каждого узла в ходе одной итерации.]]&lt;br /&gt;
&lt;br /&gt;
Раздел 1.8 уточняет, соответствуют ли эти повторения однотипным ярусам или точкам данных, вычисления для которых можно распараллелить и далее.&lt;br /&gt;
&lt;br /&gt;
Каждый процесс обладает следующими данными:&lt;br /&gt;
* координатами точек данных &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p}+1)}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;rnk&amp;lt;/math&amp;gt; – номер процесса,&lt;br /&gt;
* значениями &amp;lt;math&amp;gt;\mu_{ki}&amp;lt;/math&amp;gt; степени принадлежности для своих точек (&amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p} +1)}, i=\overline{1,c}&amp;lt;/math&amp;gt;),&lt;br /&gt;
* координатами центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=\overline{1,c}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Суммы &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m X_k}&amp;lt;/math&amp;gt; вычисляются одновременно, поэтому значения &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; вычисляются по одному разу за итерацию. Таким образом, второй ярус операций на рисунке на деле не содержит операций возведения в степень.&lt;br /&gt;
За счёт линейности большинства выражений относительно данных по точкам, процессы взаимодействуют только при редукции сумм, составляющих &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;. Всё остальное время каждый процессор работает только со своими &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точками. Это обеспечивает применимость алгоритма для больших &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
При распараллеливании по точкам исходных данных и условии останову по малому изменению степеней принадлежности выполнение одной итерации алгоритма FCM может быть разделено на следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм знаменателя (по &amp;lt;math&amp;gt;\frac{M}{p}-1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; операций возведения в степень на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм числителя (по &amp;lt;math&amp;gt;\frac{M}{p} -1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; умножений на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; редукции сумм и передач значений &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt; процессам (получение &amp;lt;math&amp;gt;c(n+1)&amp;lt;/math&amp;gt; значений, &amp;lt;math&amp;gt;cn&amp;lt;/math&amp;gt; делений),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&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; умножений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов вычисления степеней принадлежности точек (по &amp;lt;math&amp;gt;c+1&amp;lt;/math&amp;gt; делений, c возведений в степень, &amp;lt;math&amp;gt;c-1&amp;lt;/math&amp;gt; сложений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* до &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов проверки условий останова (по &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; вычитанию, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; сравнению), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; редукция для обмена статусом завершения.&lt;br /&gt;
Таким образом, при распараллеливании по точкам исходных данных при условии наличия в каждом узле достаточного объёма памяти для хранения всего массива координат центров кластеров высота и ширина ЯПФ алгоритма FCM равны соответственно &amp;lt;math&amp;gt;O(c^2 I+cnI)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: массив векторов &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt;, число кластеров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt; для входных векторов, 3 вспомогательных параметра.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;). Условие нормировки: &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
В случае неограниченного распараллеливания по точкам данных (1 процесс на точку), отношение последовательной сложности алгоритма к параллельной пропорционально &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; задаёт степень «размытости» кластеров. В отсутствие априорных данных его обычно берут равным 2. В предельном случае сведения параметра &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; к значению 1, кластеры становятся чёткими и алгоритм вырождается в алгоритм кластеризации K-Means.&lt;br /&gt;
&lt;br /&gt;
Алгоритм недетерминирован, начальное положение кластеров задаётся случайно либо явно, либо опосредованно (через матрицу принадлежности). Алгоритм сходится к локальному экстремуму &amp;lt;ref&amp;gt;Höppner, F., Klawonn, F.: [https://public.fh wolfenbuettel.de/~klawonn/Papers/hoeppnerklawonntfs03.pdf A Contribution to Convergence Theory of Fuzzy c-Means and Derivatives], Дата последнего обращения: 13.10.2016&amp;lt;/ref&amp;gt; и, таким образом, не гарантирует оптимальный результат при случайном выборе начальных значений.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
[[File:График.png|thumb|upright=2.5|frame|right|alt=Paralel Fuzzy C-Means time to iteration|График зависимости времени выполнения итерации параллельного нечеткого алгоритма С-средних (Fuzzy C-means) от количества процессоров и количества кластеризуемых вершин]]&lt;br /&gt;
&lt;br /&gt;
[[File:Effect_parallel_fuzzy_c-means.png|thumb|upright=2.5|frame|right|alt=Paralel Fuzzy C-Means efficiency|График эффективности распараллеливания нечеткого алгоритма С-средних (Fuzzy C-means) в зависимости от количества процессоров и количества кластеризуемых вершин.]]&lt;br /&gt;
&lt;br /&gt;
Исследование проведено на суперкомпьютере IBM Blue Gene/P&amp;lt;ref&amp;gt;[http://hpc.cs.msu.ru/bgp Описание вычислительного комплекса IBM Blue Gene/P]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Для исследования была использована последовательная реализация алгоритма и реализован её [https://github.com/nikmedoed/Parallel-Fuzzy-C-means параллельный вариант]&amp;lt;ref&amp;gt;[https://github.com/nikmedoed/Parallel-Fuzzy-C-means Параллельная реализация алгоритма Fuzzy C-Means]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Алгоритм обладает плохо исследованной сходимостью, но объем вычислений и итераций не зависит от значений данных, поэтому данное исследование масштабируемости было произведено для единичной итерации.&lt;br /&gt;
&lt;br /&gt;
Для упрощения экспериментов было решено использовать количество вершин для кластеризации и количество процессов равное степени двойки, поэтому для каждого эксперимента были выбраны значения:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^v, v=\overline{0,9}&amp;lt;/math&amp;gt;, для количества процессоров;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^w, w=\overline{10,20}&amp;lt;/math&amp;gt;, для количества кластеризуемых вершин.&lt;br /&gt;
&lt;br /&gt;
Для одного набора значений проводилось 4 эксперимента и результаты усреднялись. При повторных запусках экспериментов значения выходили те же самые.&lt;br /&gt;
&lt;br /&gt;
Полученные результаты говорят о хорошей масштабируемости реализации алгоритма. Для большинства экспериментов эффективность распараллеливания находится в пределах 100±3%. Высокая эффективность обуславливается тем, что данные равномерно распределены по процессорам и на каждой итерации требуется глобальная редукция всего &amp;lt;math&amp;gt;2c+1&amp;lt;/math&amp;gt; значений (&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значений числителей центроид кластеров, &amp;lt;math&amp;gt;c&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;
* пакет MATLAB &amp;lt;ref&amp;gt;[http://www.mathworks.com/help/fuzzy/fcm.html Документация пакета MATLAB, функция fcm], последнее обращение 15.10.2016&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Реализация алгоритма на POSTGRESQL &amp;lt;ref&amp;gt;[http://num-meth.srcc.msu.ru/zhurnal/tom_2012/pdf/v13r207.pdf Реализация алгоритма Fuzzy C-means на POSTGRESQL], последнее обращение 15.10.2016&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en:Parallel Fuzzy c-Means Clustering]]&lt;/div&gt;</summary>
		<author><name>Illusive mike</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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=18130</id>
		<title>Участник:Nikmedoed/Нечеткий алгоритм С-средних (Fuzzy 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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=18130"/>
		<updated>2016-11-18T13:19:11Z</updated>

		<summary type="html">&lt;p&gt;Illusive mike: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Нечеткий алгоритм С-средних (Fuzzy C-means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(c^2 MI + cMnI), (I&amp;lt;/math&amp;gt; - число итераций, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - число точек, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - размерность точек (свойств на объект)&amp;lt;math&amp;gt;)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(c^2 I + cnI)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O( M )&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Nikmedoed|Н.А. Муромцев]] - перенос в вики, раздел 2, картинки, [[Участник:illusive_mike|М.С. Дворецкий]] - раздел 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Нечеткий алгоритм С-средних&#039;&#039;&#039; (&#039;&#039;Fuzzy C-means&#039;&#039;) - позволяет получить нечёткую кластеризацию больших наборов числовых данных, что позволяет корректно определять объекты на границах кластеров. Однако, выполнение данного алгоритма требует серьёзных вычислительных ресурсов, а также изначального задания количества кластеров. Кроме того, может возникнуть неоднозначность с объектами, удалёнными от центров всех кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм кластеризации Fuzzy C-Means (FCM) был предложен Дж. Данном в 1973 году &amp;lt;ref&amp;gt;Dunn, J.C.: A Fuzzy Relative of the ISODATA Process and Its Use in Detecting Compact Well-Separated Clusters. Journal of Cybernetics. 3 (1973): 32–57&amp;lt;/ref&amp;gt; и доработан Дж. Бездеком в 1981 году &amp;lt;ref&amp;gt;Bezdek, J.C.: Pattern Recognition with Fuzzy Objective Function Algorithms. Plenum Press, New York (1981). ISBN 0-306-40671-3&amp;lt;/ref&amp;gt;. В отличие от большинства существующих алгоритмов кластеризации, данный алгоритм является нечётким – каждый из объектов не входит однозначно в какой-либо кластер, а принадлежит всем кластерам с различными степенями принадлежности. Это даёт преимущества в качестве разбиения в случаях, когда кластеры находятся близко друг к другу, и большое число точек находится на их границах. Однако ценой такой нечёткости служат большие вычислительные затраты, чем у таких чётких алгоритмов, как [[Hard C-Means]] и [[K-Means]], при сохранении таких их недостатков, как априорное определение числа кластеров и отсутствие гарантии глобальной оптимальности результата.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Исходные данные: массив объектов &amp;lt;math&amp;gt;{X_k}\in{\R^n}, k=\overline{1,M}&amp;lt;/math&amp;gt;, число кластеров c, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица разбиения &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;M\times c&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;), центры кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, расстояния &amp;lt;math&amp;gt;D_{ki}&amp;lt;/math&amp;gt; между объектами и центрами кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода (вычисляются последовательно на каждой итерации):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Уточнение центров кластеров по степеням принадлежности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;V_i=\frac{\sum^{M}_{k=1} {\mu^m_{ki} * X_k}}{\sum^{M}_{k=1} {\mu^m_{ki}}},i=\overline{1,c}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
2. Расчёт расстояний между новыми центрами кластеров и точками данных&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
3. Пересчёт степеней принадлежности объектов кластерам&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} \left ( {\frac{D_{ki}}{D_{kj}}} \right ) }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждой итерации алгоритма происходит уточнение элементов матрицы &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Выходом алгоритма служит матрица &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, к которой алгоритм сходится. Факт того, что алгоритм сошёлся, устанавливается проверкой вида &amp;lt;math&amp;gt;\max_{k = \overline{1,M},i = \overline{1,c}} {( \left | \mu_{ki} - \mu_{ki}^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;  либо  &amp;lt;math&amp;gt;\max_{i = \overline{1,c}} {( \left | V_i - V_i^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mu_{ki}^* (V_i^*)&amp;lt;/math&amp;gt; – значение &amp;lt;math&amp;gt;\mu_{ki}(V_i)&amp;lt;/math&amp;gt;, вычисленное на предыдущей итерации.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Вычислительное ядро алгоритма Fuzzy C-Means составляют шаги вычисления центров кластеров, расстояний между ними и точками данных и в особенности пересчёта матрицы степеней принадлежности точек данных.&lt;br /&gt;
&lt;br /&gt;
При реальном вычислении некоторые повторяющиеся вычисления могут быть устранены. Так, для шага вычисления центров кластеров величины &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; могут вычисляться однократно и умножаться на &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt; при включении в сумму, записанную в числителе. Для шага вычисления расстояний между центрами кластеров и точками, операция взятия квадратного корня не является обязательной, так как в дальнейшем на шаге вычисления степеней принадлежности можно непосредственно использовать квадраты этих расстояний, и сумма в знаменателе будет приобретать вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum^{c}_{j=1} {\left ( \frac{D_{ki} ^ {2}}{D_{kj} ^ {2}} \right )}^{{1}/{m-1}}&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;
Инициализация происходит случайным заполнением матрицы принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; с соблюдением условия нормировки &amp;lt;math&amp;gt;\sum_{i=1}^c {\mu_{ki} =1}&amp;lt;/math&amp;gt; и переходом к шагу 1, либо случайным определением центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt; и переходом к шагу 2.&lt;br /&gt;
&lt;br /&gt;
Далее осуществляются итерации следующего вида:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;V_i=\frac{\sum_{k=1}^{M} {\mu_{ki}^m * X_k}}{\sum_{k=1}^{M} {\mu_{ki}^m} },i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} {\left ( \frac{D_{ki}}{D_{kj}} \right )} }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конце каждой итерации проверяется условие останова вида &amp;lt;math&amp;gt;\max_{k = \overline{1,M},i = \overline{1,c}} {( \left | \mu_{ki} - \mu_{ki}^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, либо &amp;lt;math&amp;gt;\max_{i = \overline{1,c}} {( \left | V_i - V_i^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mu_{ki}^* (V_i^*)&amp;lt;/math&amp;gt; – значение &amp;lt;math&amp;gt;\mu_{ki}(V_i)&amp;lt;/math&amp;gt;, вычисленное на предыдущей итерации. Если условие не выполнено, осуществляется переход к шагу 1.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
При кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; объектов данных, представленных точками в &amp;lt;math&amp;gt;\R^n&amp;lt;/math&amp;gt;, на &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; кластеров, алгоритм Fuzzy C-Means в последовательном варианте имеет вычислительную сложность – &amp;lt;math&amp;gt;O(c^2 MI+cMnI)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; – число итераций. Если считать размерность данных &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; малой, то эта сложность сводится к &amp;lt;math&amp;gt;O(c^2 MI)&amp;lt;/math&amp;gt;. Основной частью алгоритма в этом случае является пересчёт матрицы принадлежностей, требующий вычисления &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt; сумм из &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; слагаемых на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Приведём граф единичной итерации алгоритма в параллельном оптимизированном варианте (метод распараллеливания взят в &amp;lt;ref&amp;gt;Kwok, T., Smith, K.,&lt;br /&gt;
Lozano, S., Taniar, D.: [http://num-meth.srcc.msu.ru/zhurnal/tom_2012/pdf/v13r207.pdf Parallel Fuzzy c-Means Clustering for Large Data Sets], последнее обращение 25.10.2016&amp;lt;/ref&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
[[File:C-means_paralle_graph.png|thumb|upright=2.5|frame|center|alt=Paralel Fuzzy C-Means|Каждая вершина данного графа соответствует операциям из алгоритма, указанным при помощи указанных формул. Каждый из p столбцов соответствует работе одного из процессов. Пометки справа указывают число повторений каждого узла в ходе одной итерации.]]&lt;br /&gt;
&lt;br /&gt;
Раздел 1.8 уточняет, соответствуют ли эти повторения однотипным ярусам или точкам данных, вычисления для которых можно распараллелить и далее.&lt;br /&gt;
&lt;br /&gt;
Каждый процесс обладает следующими данными:&lt;br /&gt;
* координатами точек данных &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p}+1)}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;rnk&amp;lt;/math&amp;gt; – номер процесса,&lt;br /&gt;
* значениями &amp;lt;math&amp;gt;\mu_{ki}&amp;lt;/math&amp;gt; степени принадлежности для своих точек (&amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p} +1)}, i=\overline{1,c}&amp;lt;/math&amp;gt;),&lt;br /&gt;
* координатами центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=\overline{1,c}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Суммы &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m X_k}&amp;lt;/math&amp;gt; вычисляются одновременно, поэтому значения &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; вычисляются по одному разу за итерацию. Таким образом, второй ярус операций на рисунке на деле не содержит операций возведения в степень.&lt;br /&gt;
За счёт линейности большинства выражений относительно данных по точкам, процессы взаимодействуют только при редукции сумм, составляющих &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;. Всё остальное время каждый процессор работает только со своими &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точками. Это обеспечивает применимость алгоритма для больших &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
При распараллеливании по точкам исходных данных и условии останову по малому изменению степеней принадлежности выполнение одной итерации алгоритма FCM может быть разделено на следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм знаменателя (по &amp;lt;math&amp;gt;\frac{M}{p}-1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; операций возведения в степень на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм числителя (по &amp;lt;math&amp;gt;\frac{M}{p} -1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; умножений на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; редукции сумм и передач значений &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt; процессам (получение &amp;lt;math&amp;gt;c(n+1)&amp;lt;/math&amp;gt; значений, &amp;lt;math&amp;gt;cn&amp;lt;/math&amp;gt; делений),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&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; умножений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов вычисления степеней принадлежности точек (по &amp;lt;math&amp;gt;c+1&amp;lt;/math&amp;gt; делений, c возведений в степень, &amp;lt;math&amp;gt;c-1&amp;lt;/math&amp;gt; сложений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* до &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов проверки условий останова (по &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; вычитанию, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; сравнению), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; редукция для обмена статусом завершения.&lt;br /&gt;
Таким образом, при распараллеливании по точкам исходных данных при условии наличия в каждом узле достаточного объёма памяти для хранения всего массива координат центров кластеров высота и ширина ЯПФ алгоритма FCM равны соответственно &amp;lt;math&amp;gt;O(c^2 I+cnI)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: массив векторов &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt;, число кластеров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt; для входных векторов, 3 вспомогательных параметра.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;). Условие нормировки: &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
В случае неограниченного распараллеливания по точкам данных (1 процесс на точку), отношение последовательной сложности алгоритма к параллельной пропорционально &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; задаёт степень «размытости» кластеров. В отсутствие априорных данных его обычно берут равным 2. В предельном случае сведения параметра &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; к значению 1, кластеры становятся чёткими и алгоритм вырождается в алгоритм кластеризации K-Means.&lt;br /&gt;
&lt;br /&gt;
Алгоритм недетерминирован, начальное положение кластеров задаётся случайно либо явно, либо опосредованно (через матрицу принадлежности). Алгоритм сходится к локальному экстремуму &amp;lt;ref&amp;gt;Höppner, F., Klawonn, F.: [https://public.fh wolfenbuettel.de/~klawonn/Papers/hoeppnerklawonntfs03.pdf A Contribution to Convergence Theory of Fuzzy c-Means and Derivatives], Дата последнего обращения: 13.10.2016&amp;lt;/ref&amp;gt; и, таким образом, не гарантирует оптимальный результат при случайном выборе начальных значений.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
[[File:График.png|thumb|upright=2.5|frame|right|alt=Paralel Fuzzy C-Means time to iteration|График зависимости времени выполнения итерации параллельного нечеткого алгоритма С-средних (Fuzzy C-means) от количества процессоров и количества кластеризуемых вершин]]&lt;br /&gt;
&lt;br /&gt;
[[File:Effect_parallel_fuzzy_c-means.png|thumb|upright=2.5|frame|right|alt=Paralel Fuzzy C-Means efficiency|График эффективности распараллеливания нечеткого алгоритма С-средних (Fuzzy C-means) в зависимости от количества процессоров и количества кластеризуемых вершин.]]&lt;br /&gt;
&lt;br /&gt;
Исследование проведено на суперкомпьютере IBM Blue Gene/P&amp;lt;ref&amp;gt;[http://hpc.cs.msu.ru/bgp Описание вычислительного комплекса IBM Blue Gene/P]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Для исследования была использована последовательная реализация алгоритма и реализован её [https://github.com/nikmedoed/Parallel-Fuzzy-C-means параллельный вариант]&amp;lt;ref&amp;gt;[https://github.com/nikmedoed/Parallel-Fuzzy-C-means Параллельная реализация алгоритма Fuzzy C-Means]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Алгоритм обладает плохо исследованной сходимостью, но объем вычислений и итераций не зависит от значений данных, поэтому данное исследование масштабируемости было произведено для единичной итерации.&lt;br /&gt;
&lt;br /&gt;
Для упрощения экспериментов было решено использовать количество вершин для кластеризации и количество процессов равное степени двойки, поэтому для каждого эксперимента были выбраны значения:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^v, v=\overline{0,9}&amp;lt;/math&amp;gt;, для количества процессоров;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^w, w=\overline{10,20}&amp;lt;/math&amp;gt;, для количества кластеризуемых вершин.&lt;br /&gt;
&lt;br /&gt;
Для одного набора значений проводилось 4 эксперимента и результаты усреднялись. При повторных запусках экспериментов значения выходили те же самые.&lt;br /&gt;
&lt;br /&gt;
Полученные результаты говорят о хорошей масштабируемости реализации алгоритма. Для большинства экспериментов эффективность распараллеливания находится в пределах 100±3%. Высокая эффективность обуславливается тем, что данные равномерно распределены по процессорам и на каждой итерации требуется глобальная редукция всего &amp;lt;math&amp;gt;2c+1&amp;lt;/math&amp;gt; значений (&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; значений числителей центроид кластеров, &amp;lt;math&amp;gt;c&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;
* пакет MATLAB &amp;lt;ref&amp;gt;[http://www.mathworks.com/help/fuzzy/fcm.html Документация пакета MATLAB, функция fcm], последнее обращение 15.10.2016&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Реализация алгоритма на POSTGRESQL &amp;lt;ref&amp;gt;[http://num-meth.srcc.msu.ru/zhurnal/tom_2012/pdf/v13r207.pdf Реализация алгоритма Fuzzy C-means на POSTGRESQL], последнее обращение 15.10.2016&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en:Parallel Fuzzy c-Means Clustering]]&lt;/div&gt;</summary>
		<author><name>Illusive mike</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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=14843</id>
		<title>Участник:Nikmedoed/Нечеткий алгоритм С-средних (Fuzzy 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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=14843"/>
		<updated>2016-10-30T16:01:30Z</updated>

		<summary type="html">&lt;p&gt;Illusive mike: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нечеткий алгоритм С-средних (Fuzzy C-means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(c^2 MI + cMnI), (I&amp;lt;/math&amp;gt; - число итераций, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - число точек, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - размерность точек (свойств на объект)&amp;lt;math&amp;gt;)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(c^2 I + cnI)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O( M )&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Nikmedoed|Н.А. Муромцев]] - перенос в вики, раздел 2, картинки, [[Участник:illusive_mike|М.С. Дворецкий]] - раздел 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Нечеткий алгоритм С-средних&#039;&#039;&#039; (&#039;&#039;Fuzzy C-means&#039;&#039;) - позволяет получить нечёткую кластеризацию больших наборов числовых данных, что позволяет корректно определять объекты на границах кластеров. Однако, выполнение данного алгоритма требует серьёзных вычислительных ресурсов, а также изначального задания количества кластеров. Кроме того, может возникнуть неоднозначность с объектами, удалёнными от центров всех кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм кластеризации Fuzzy C-Means (FCM) был предложен Дж. Данном в 1973 году &amp;lt;ref&amp;gt;Dunn, J.C.: A Fuzzy Relative of the ISODATA Process and Its Use in Detecting Compact Well-Separated Clusters. Journal of Cybernetics. 3 (1973): 32–57&amp;lt;/ref&amp;gt; и доработан Дж. Бездеком в 1981 году &amp;lt;ref&amp;gt;Bezdek, J.C.: Pattern Recognition with Fuzzy Objective Function Algorithms. Plenum Press, New York (1981). ISBN 0-306-40671-3&amp;lt;/ref&amp;gt;. В отличие от большинства существующих алгоритмов кластеризации, данный алгоритм является нечётким – каждый из объектов не входит однозначно в какой-либо кластер, а принадлежит всем кластерам с различными степенями принадлежности. Это даёт преимущества в качестве разбиения в случаях, когда кластеры находятся близко друг к другу, и большое число точек находится на их границах. Однако ценой такой нечёткости служат большие вычислительные затраты, чем у таких чётких алгоритмов, как [[Hard C-Means]] и [[K-Means]], при сохранении таких их недостатков, как априорное определение числа кластеров и отсутствие гарантии глобальной оптимальности результата.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Исходные данные: массив объектов &amp;lt;math&amp;gt;{X_k}\in{\R^n}, k=\overline{1,M}&amp;lt;/math&amp;gt;, число кластеров c, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица разбиения &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;M\times c&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;), центры кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, расстояния &amp;lt;math&amp;gt;D_{ki}&amp;lt;/math&amp;gt; между объектами и центрами кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода (вычисляются последовательно на каждой итерации):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Уточнение центров кластеров по степеням принадлежности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;V_i=\frac{\sum^{M}_{k=1} {\mu^m_{ki} * X_k}}{\sum^{M}_{k=1} {\mu^m_{ki}}},i=\overline{1,c}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
2. Расчёт расстояний между новыми центрами кластеров и точками данных&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
3. Пересчёт степеней принадлежности объектов кластерам&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} \left ( {\frac{D_{ki}}{D_{kj}}} \right ) }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждой итерации алгоритма происходит уточнение элементов матрицы &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Выходом алгоритма служит матрица &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, к которой алгоритм сходится. Факт того, что алгоритм сошёлся, устанавливается проверкой вида &amp;lt;math&amp;gt;\max_{k = \overline{1,M},i = \overline{1,c}} {( \left | \mu_{ki} - \mu_{ki}^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;  либо  &amp;lt;math&amp;gt;\max_{i = \overline{1,c}} {( \left | V_i - V_i^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mu_{ki}^* (V_i^*)&amp;lt;/math&amp;gt; – значение &amp;lt;math&amp;gt;\mu_{ki}(V_i)&amp;lt;/math&amp;gt;, вычисленное на предыдущей итерации.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Вычислительное ядро алгоритма Fuzzy C-Means составляют шаги вычисления центров кластеров, расстояний между ними и точками данных и в особенности пересчёта матрицы степеней принадлежности точек данных.&lt;br /&gt;
&lt;br /&gt;
При реальном вычислении некоторые повторяющиеся вычисления могут быть устранены. Так, для шага вычисления центров кластеров величины &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; могут вычисляться однократно и умножаться на &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt; при включении в сумму, записанную в числителе. Для шага вычисления расстояний между центрами кластеров и точками, операция взятия квадратного корня не является обязательной, так как в дальнейшем на шаге вычисления степеней принадлежности можно непосредственно использовать квадраты этих расстояний, и сумма в знаменателе будет приобретать вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum^{c}_{j=1} {\left ( \frac{D_{ki} ^ {2}}{D_{kj} ^ {2}} \right )}^{{1}/{m-1}}&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;
Инициализация происходит случайным заполнением матрицы принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; с соблюдением условия нормировки &amp;lt;math&amp;gt;\sum_{i=1}^c {\mu_{ki} =1}&amp;lt;/math&amp;gt; и переходом к шагу 1, либо случайным определением центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt; и переходом к шагу 2.&lt;br /&gt;
&lt;br /&gt;
Далее осуществляются итерации следующего вида:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;V_i=\frac{\sum_{k=1}^{M} {\mu_{ki}^m * X_k}}{\sum_{k=1}^{M} {\mu_{ki}^m} },i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} {\left ( \frac{D_{ki}}{D_{kj}} \right )} }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конце каждой итерации проверяется условие останова вида &amp;lt;math&amp;gt;\max_{k = \overline{1,M},i = \overline{1,c}} {( \left | \mu_{ki} - \mu_{ki}^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, либо &amp;lt;math&amp;gt;\max_{i = \overline{1,c}} {( \left | V_i - V_i^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mu_{ki}^* (V_i^*)&amp;lt;/math&amp;gt; – значение &amp;lt;math&amp;gt;\mu_{ki}(V_i)&amp;lt;/math&amp;gt;, вычисленное на предыдущей итерации. Если условие не выполнено, осуществляется переход к шагу 1.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
При кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; объектов данных, представленных точками в &amp;lt;math&amp;gt;\R^n&amp;lt;/math&amp;gt;, на &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; кластеров, алгоритм Fuzzy C-Means в последовательном варианте имеет вычислительную сложность – &amp;lt;math&amp;gt;O(c^2 MI+cMnI)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; – число итераций. Если считать размерность данных &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; малой, то эта сложность сводится к &amp;lt;math&amp;gt;O(c^2 MI)&amp;lt;/math&amp;gt;. Основной частью алгоритма в этом случае является пересчёт матрицы принадлежностей, требующий вычисления &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt; сумм из &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; слагаемых на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Приведём граф единичной итерации алгоритма в параллельном оптимизированном варианте (метод распараллеливания взят в &amp;lt;ref&amp;gt;Kwok, T., Smith, K.,&lt;br /&gt;
Lozano, S., Taniar, D.: [http://num-meth.srcc.msu.ru/zhurnal/tom_2012/pdf/v13r207.pdf Parallel Fuzzy c-Means Clustering for Large Data Sets], последнее обращение 25.10.2016&amp;lt;/ref&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
[[File:C-means_paralle_graph.png|thumb|upright=2.5|frame|center|alt=Paralel Fuzzy C-Means|Каждая вершина данного графа соответствует операциям из алгоритма, указанным при помощи указанных формул. Каждый из p столбцов соответствует работе одного из процессов. Пометки справа указывают число повторений каждого узла в ходе одной итерации.]]&lt;br /&gt;
&lt;br /&gt;
Раздел 1.8 уточняет, соответствуют ли эти повторения однотипным ярусам или точкам данных, вычисления для которых можно распараллелить и далее.&lt;br /&gt;
&lt;br /&gt;
Каждый процесс обладает следующими данными:&lt;br /&gt;
* координатами точек данных &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p}+1)}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;rnk&amp;lt;/math&amp;gt; – номер процесса,&lt;br /&gt;
* значениями &amp;lt;math&amp;gt;\mu_{ki}&amp;lt;/math&amp;gt; степени принадлежности для своих точек (&amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p} +1)}, i=\overline{1,c}&amp;lt;/math&amp;gt;),&lt;br /&gt;
* координатами центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=\overline{1,c}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Суммы &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m X_k}&amp;lt;/math&amp;gt; вычисляются одновременно, поэтому значения &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; вычисляются по одному разу за итерацию. Таким образом, второй ярус операций на рисунке на деле не содержит операций возведения в степень.&lt;br /&gt;
За счёт линейности большинства выражений относительно данных по точкам, процессы взаимодействуют только при редукции сумм, составляющих &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;. Всё остальное время каждый процессор работает только со своими &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точками. Это обеспечивает применимость алгоритма для больших &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
При распараллеливании по точкам исходных данных и условии останову по малому изменению степеней принадлежности выполнение одной итерации алгоритма FCM может быть разделено на следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм знаменателя (по &amp;lt;math&amp;gt;\frac{M}{p}-1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; операций возведения в степень на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм числителя (по &amp;lt;math&amp;gt;\frac{M}{p} -1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; умножений на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; редукции сумм и передач значений &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt; процессам (получение &amp;lt;math&amp;gt;c(n+1)&amp;lt;/math&amp;gt; значений, &amp;lt;math&amp;gt;cn&amp;lt;/math&amp;gt; делений),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&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; умножений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов вычисления степеней принадлежности точек (по &amp;lt;math&amp;gt;c+1&amp;lt;/math&amp;gt; делений, c возведений в степень, &amp;lt;math&amp;gt;c-1&amp;lt;/math&amp;gt; сложений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* до &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов проверки условий останова (по &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; вычитанию, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; сравнению), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; редукция для обмена статусом завершения.&lt;br /&gt;
Таким образом, при распараллеливании по точкам исходных данных при условии наличия в каждом узле достаточного объёма памяти для хранения всего массива координат центров кластеров высота и ширина ЯПФ алгоритма FCM равны соответственно &amp;lt;math&amp;gt;O(c^2 I+cnI)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: массив векторов &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt;, число кластеров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt; для входных векторов, 3 вспомогательных параметра.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;). Условие нормировки: &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
В случае неограниченного распараллеливания по точкам данных (1 процесс на точку), отношение последовательной сложности алгоритма к параллельной пропорционально &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; задаёт степень «размытости» кластеров. В отсутствие априорных данных его обычно берут равным 2. В предельном случае сведения параметра &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; к значению 1, кластеры становятся чёткими и алгоритм вырождается в алгоритм кластеризации K-Means.&lt;br /&gt;
&lt;br /&gt;
Алгоритм недетерминирован, начальное положение кластеров задаётся случайно либо явно, либо опосредованно (через матрицу принадлежности). Алгоритм сходится к локальному экстремуму &amp;lt;ref&amp;gt;Höppner, F., Klawonn, F.: [https://public.fh wolfenbuettel.de/~klawonn/Papers/hoeppnerklawonntfs03.pdf A Contribution to Convergence Theory of Fuzzy c-Means and Derivatives], Дата последнего обращения: 13.10.2016&amp;lt;/ref&amp;gt; и, таким образом, не гарантирует оптимальный результат при случайном выборе начальных значений.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
* пакет MATLAB &amp;lt;ref&amp;gt;[http://www.mathworks.com/help/fuzzy/fcm.html Документация пакета MATLAB, функция fcm], последнее обращение 15.10.2016&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Реализация алгоритма на POSTGRESQL &amp;lt;ref&amp;gt;[http://num-meth.srcc.msu.ru/zhurnal/tom_2012/pdf/v13r207.pdf Реализация алгоритма Fuzzy C-means на POSTGRESQL], последнее обращение 15.10.2016&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en:Parallel Fuzzy c-Means Clustering]]&lt;/div&gt;</summary>
		<author><name>Illusive mike</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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=14841</id>
		<title>Участник:Nikmedoed/Нечеткий алгоритм С-средних (Fuzzy 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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=14841"/>
		<updated>2016-10-30T15:58:30Z</updated>

		<summary type="html">&lt;p&gt;Illusive mike: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нечеткий алгоритм С-средних (Fuzzy C-means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(c^2 MI + cMnI), (I&amp;lt;/math&amp;gt; - число итераций, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - число точек, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - размерность точек (свойств на объект)&amp;lt;math&amp;gt;)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(c^2 I + cnI)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O( M )&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Nikmedoed|Н.А. Муромцев]] - перенос в вики, раздел 2, картинки, [[Участник:illusive_mike|М.С. Дворецкий]] - раздел 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Нечеткий алгоритм С-средних&#039;&#039;&#039; (&#039;&#039;Fuzzy C-means&#039;&#039;) - позволяет получить нечёткую кластеризацию больших наборов числовых данных, что позволяет корректно определять объекты на границах кластеров. Однако, выполнение данного алгоритма требует серьёзных вычислительных ресурсов, а также изначального задания количества кластеров. Кроме того, может возникнуть неоднозначность с объектами, удалёнными от центров всех кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм кластеризации Fuzzy C-Means (FCM) был предложен Дж. Данном в 1973 году &amp;lt;ref&amp;gt;Dunn, J.C.: A Fuzzy Relative of the ISODATA Process and Its Use in Detecting Compact Well-Separated Clusters. Journal of Cybernetics. 3 (1973): 32–57&amp;lt;/ref&amp;gt; и доработан Дж. Бездеком в 1981 году &amp;lt;ref&amp;gt;Bezdek, J.C.: Pattern Recognition with Fuzzy Objective Function Algorithms. Plenum Press, New York (1981). ISBN 0-306-40671-3&amp;lt;/ref&amp;gt;. В отличие от большинства существующих алгоритмов кластеризации, данный алгоритм является нечётким – каждый из объектов не входит однозначно в какой-либо кластер, а принадлежит всем кластерам с различными степенями принадлежности. Это даёт преимущества в качестве разбиения в случаях, когда кластеры находятся близко друг к другу, и большое число точек находится на их границах. Однако ценой такой нечёткости служат большие вычислительные затраты, чем у таких чётких алгоритмов, как [[Hard C-Means]] и [[K-Means]], при сохранении таких их недостатков, как априорное определение числа кластеров и отсутствие гарантии глобальной оптимальности результата.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Исходные данные: массив объектов &amp;lt;math&amp;gt;{X_k}\in{\R^n}, k=\overline{1,M}&amp;lt;/math&amp;gt;, число кластеров c, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица разбиения &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;M\times c&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;), центры кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, расстояния &amp;lt;math&amp;gt;D_{ki}&amp;lt;/math&amp;gt; между объектами и центрами кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода (вычисляются последовательно на каждой итерации):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Уточнение центров кластеров по степеням принадлежности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;V_i=\frac{\sum^{M}_{k=1} {\mu^m_{ki} * X_k}}{\sum^{M}_{k=1} {\mu^m_{ki}}},i=\overline{1,c}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
2. Расчёт расстояний между новыми центрами кластеров и точками данных&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
3. Пересчёт степеней принадлежности объектов кластерам&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} \left ( {\frac{D_{ki}}{D_{kj}}} \right ) }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждой итерации алгоритма происходит уточнение элементов матрицы &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Выходом алгоритма служит матрица &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, к которой алгоритм сходится. Факт того, что алгоритм сошёлся, устанавливается проверкой вида &amp;lt;math&amp;gt;\max_{k = \overline{1,M},i = \overline{1,c}} {( \left | \mu_{ki} - \mu_{ki}^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;  либо  &amp;lt;math&amp;gt;\max_{i = \overline{1,c}} {( \left | V_i - V_i^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mu_{ki}^* (V_i^*)&amp;lt;/math&amp;gt; – значение &amp;lt;math&amp;gt;\mu_{ki}(V_i)&amp;lt;/math&amp;gt;, вычисленное на предыдущей итерации.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Вычислительное ядро алгоритма Fuzzy C-Means составляют шаги вычисления центров кластеров, расстояний между ними и точками данных и в особенности пересчёта матрицы степеней принадлежности точек данных.&lt;br /&gt;
&lt;br /&gt;
При реальном вычислении некоторые повторяющиеся вычисления могут быть устранены. Так, для шага вычисления центров кластеров величины &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; могут вычисляться однократно и умножаться на &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt; при включении в сумму, записанную в числителе. Для шага вычисления расстояний между центрами кластеров и точками, операция взятия квадратного корня не является обязательной, так как в дальнейшем на шаге вычисления степеней принадлежности можно непосредственно использовать квадраты этих расстояний, и сумма в знаменателе будет приобретать вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum^{c}_{j=1} {\left ( \frac{D_{ki} ^ {2}}{D_{kj} ^ {2}} \right )}^{{1}/{m-1}}&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;
Инициализация происходит случайным заполнением матрицы принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; с соблюдением условия нормировки &amp;lt;math&amp;gt;\sum_{i=1}^c {\mu_{ki} =1}&amp;lt;/math&amp;gt; и переходом к шагу 1, либо случайным определением центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt; и переходом к шагу 2.&lt;br /&gt;
&lt;br /&gt;
Далее осуществляются итерации следующего вида:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;V_i=\frac{\sum_{k=1}^{M} {\mu_{ki}^m * X_k}}{\sum_{k=1}^{M} {\mu_{ki}^m} },i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} {\left ( \frac{D_{ki}}{D_{kj}} \right )} }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конце каждой итерации проверяется условие останова вида &amp;lt;math&amp;gt;\max_{k = \overline{1,M},i = \overline{1,c}} {( \left | \mu_{ki} - \mu_{ki}^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, либо &amp;lt;math&amp;gt;\max_{i = \overline{1,c}} {( \left | V_i - V_i^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mu_{ki}^* (V_i^*)&amp;lt;/math&amp;gt; – значение &amp;lt;math&amp;gt;\mu_{ki}(V_i)&amp;lt;/math&amp;gt;, вычисленное на предыдущей итерации. Если условие не выполнено, осуществляется переход к шагу 1.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
При кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; объектов данных, представленных точками в &amp;lt;math&amp;gt;\R^n&amp;lt;/math&amp;gt;, на &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; кластеров, алгоритм Fuzzy C-Means в последовательном варианте имеет вычислительную сложность – &amp;lt;math&amp;gt;O(c^2 MI+cMnI)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; – число итераций. Если считать размерность данных &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; малой, то эта сложность сводится к &amp;lt;math&amp;gt;O(c^2 MI)&amp;lt;/math&amp;gt;. Основной частью алгоритма в этом случае является пересчёт матрицы принадлежностей, требующий вычисления &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt; сумм из &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; слагаемых на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Приведём граф единичной итерации алгоритма в параллельном оптимизированном варианте (метод распараллеливания взят в &amp;lt;ref&amp;gt;Kwok, T., Smith, K.,&lt;br /&gt;
Lozano, S., Taniar, D.: [http://num-meth.srcc.msu.ru/zhurnal/tom_2012/pdf/v13r207.pdf Parallel Fuzzy c-Means Clustering for Large Data Sets], последнее обращение 25.10.2016&amp;lt;/ref&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
[[File:C-means_paralle_graph.png|thumb|upright=2.5|frame|center|alt=Paralel Fuzzy C-Means|Каждая вершина данного графа соответствует операциям из алгоритма, указанным при помощи указанных формул. Каждый из p столбцов соответствует работе одного из процессов. Пометки справа указывают число повторений каждого узла в ходе одной итерации.]]&lt;br /&gt;
&lt;br /&gt;
Раздел 1.8 уточняет, соответствуют ли эти повторения однотипным ярусам или точкам данных, вычисления для которых можно распараллелить и далее.&lt;br /&gt;
&lt;br /&gt;
Каждый процесс обладает следующими данными:&lt;br /&gt;
* координатами точек данных &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p}+1)}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;rnk&amp;lt;/math&amp;gt; – номер процесса,&lt;br /&gt;
* значениями &amp;lt;math&amp;gt;\mu_{ki}&amp;lt;/math&amp;gt; степени принадлежности для своих точек (&amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p} +1)}, i=\overline{1,c}&amp;lt;/math&amp;gt;),&lt;br /&gt;
* координатами центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=\overline{1,c}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Суммы &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m X_k}&amp;lt;/math&amp;gt; вычисляются одновременно, поэтому значения &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; вычисляются по одному разу за итерацию. Таким образом, второй ярус операций на рисунке на деле не содержит операций возведения в степень.&lt;br /&gt;
За счёт линейности большинства выражений относительно данных по точкам, процессы взаимодействуют только при редукции сумм, составляющих &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;. Всё остальное время каждый процессор работает только со своими &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точками. Это обеспечивает применимость алгоритма для больших &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
При распараллеливании по точкам исходных данных и условии останову по малому изменению степеней принадлежности выполнение одной итерации алгоритма FCM может быть разделено на следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм знаменателя (по &amp;lt;math&amp;gt;\frac{M}{p}-1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; операций возведения в степень на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм числителя (по &amp;lt;math&amp;gt;\frac{M}{p} -1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; умножений на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; редукции сумм и передач значений &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt; процессам (получение &amp;lt;math&amp;gt;2c&amp;lt;/math&amp;gt; значений, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; делений),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&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; умножений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов вычисления степеней принадлежности точек (по &amp;lt;math&amp;gt;c+1&amp;lt;/math&amp;gt; делений, c возведений в степень, &amp;lt;math&amp;gt;c-1&amp;lt;/math&amp;gt; сложений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* до &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов проверки условий останова (по &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; вычитанию, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; сравнению), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; редукция для обмена статусом завершения.&lt;br /&gt;
Таким образом, при распараллеливании по точкам исходных данных при условии наличия в каждом узле достаточного объёма памяти для хранения всего массива координат центров кластеров высота и ширина ЯПФ алгоритма FCM равны соответственно &amp;lt;math&amp;gt;O(c^2 I+cnI)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: массив векторов &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt;, число кластеров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt; для входных векторов, 3 вспомогательных параметра.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;). Условие нормировки: &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
В случае неограниченного распараллеливания по точкам данных (1 процесс на точку), отношение последовательной сложности алгоритма к параллельной пропорционально &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; задаёт степень «размытости» кластеров. В отсутствие априорных данных его обычно берут равным 2. В предельном случае сведения параметра &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; к значению 1, кластеры становятся чёткими и алгоритм вырождается в алгоритм кластеризации K-Means.&lt;br /&gt;
&lt;br /&gt;
Алгоритм недетерминирован, начальное положение кластеров задаётся случайно либо явно, либо опосредованно (через матрицу принадлежности). Алгоритм сходится к локальному экстремуму &amp;lt;ref&amp;gt;Höppner, F., Klawonn, F.: [https://public.fh wolfenbuettel.de/~klawonn/Papers/hoeppnerklawonntfs03.pdf A Contribution to Convergence Theory of Fuzzy c-Means and Derivatives], Дата последнего обращения: 13.10.2016&amp;lt;/ref&amp;gt; и, таким образом, не гарантирует оптимальный результат при случайном выборе начальных значений.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
* пакет MATLAB &amp;lt;ref&amp;gt;[http://www.mathworks.com/help/fuzzy/fcm.html Документация пакета MATLAB, функция fcm], последнее обращение 15.10.2016&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Реализация алгоритма на POSTGRESQL &amp;lt;ref&amp;gt;[http://num-meth.srcc.msu.ru/zhurnal/tom_2012/pdf/v13r207.pdf Реализация алгоритма Fuzzy C-means на POSTGRESQL], последнее обращение 15.10.2016&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en:Parallel Fuzzy c-Means Clustering]]&lt;/div&gt;</summary>
		<author><name>Illusive mike</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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=14840</id>
		<title>Участник:Nikmedoed/Нечеткий алгоритм С-средних (Fuzzy 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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=14840"/>
		<updated>2016-10-30T15:57:18Z</updated>

		<summary type="html">&lt;p&gt;Illusive mike: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нечеткий алгоритм С-средних (Fuzzy C-means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(c^2 MI + cMnI), (I&amp;lt;/math&amp;gt; - число итераций, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - число точек, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - размерность точек (свойств на объект)&amp;lt;math&amp;gt;)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(c^2 I + cnI)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O( M )&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Nikmedoed|Н.А. Муромцев]] - перенос в вики, раздел 2, картинки, [[Участник:illusive_mike|М.С. Дворецкий]] - раздел 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Нечеткий алгоритм С-средних&#039;&#039;&#039; (&#039;&#039;Fuzzy C-means&#039;&#039;) - позволяет получить нечёткую кластеризацию больших наборов числовых данных, что позволяет корректно определять объекты на границах кластеров. Однако, выполнение данного алгоритма требует серьёзных вычислительных ресурсов, а также изначального задания количества кластеров. Кроме того, может возникнуть неоднозначность с объектами, удалёнными от центров всех кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм кластеризации Fuzzy C-Means (FCM) был предложен Дж. Данном в 1973 году &amp;lt;ref&amp;gt;Dunn, J.C.: A Fuzzy Relative of the ISODATA Process and Its Use in Detecting Compact Well-Separated Clusters. Journal of Cybernetics. 3 (1973): 32–57&amp;lt;/ref&amp;gt; и доработан Дж. Бездеком в 1981 году &amp;lt;ref&amp;gt;Bezdek, J.C.: Pattern Recognition with Fuzzy Objective Function Algorithms. Plenum Press, New York (1981). ISBN 0-306-40671-3&amp;lt;/ref&amp;gt;. В отличие от большинства существующих алгоритмов кластеризации, данный алгоритм является нечётким – каждый из объектов не входит однозначно в какой-либо кластер, а принадлежит всем кластерам с различными степенями принадлежности. Это даёт преимущества в качестве разбиения в случаях, когда кластеры находятся близко друг к другу, и большое число точек находится на их границах. Однако ценой такой нечёткости служат большие вычислительные затраты, чем у таких чётких алгоритмов, как [[Hard C-Means]] и [[K-Means]], при сохранении таких их недостатков, как априорное определение числа кластеров и отсутствие гарантии глобальной оптимальности результата.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Исходные данные: массив объектов &amp;lt;math&amp;gt;{X_k}\in{\R^n}, k=\overline{1,M}&amp;lt;/math&amp;gt;, число кластеров c, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица разбиения &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;M\times c&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;), центры кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, расстояния &amp;lt;math&amp;gt;D_{ki}&amp;lt;/math&amp;gt; между объектами и центрами кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода (вычисляются последовательно на каждой итерации):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Уточнение центров кластеров по степеням принадлежности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;V_i=\frac{\sum^{M}_{k=1} {\mu^m_{ki} * X_k}}{\sum^{M}_{k=1} {\mu^m_{ki}}},i=\overline{1,c}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
2. Расчёт расстояний между новыми центрами кластеров и точками данных&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
3. Пересчёт степеней принадлежности объектов кластерам&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} \left ( {\frac{D_{ki}}{D_{kj}}} \right ) }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждой итерации алгоритма происходит уточнение элементов матрицы &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Выходом алгоритма служит матрица &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, к которой алгоритм сходится. Факт того, что алгоритм сошёлся, устанавливается проверкой вида &amp;lt;math&amp;gt;\max_{k = \overline{1,M},i = \overline{1,c}} {( \left | \mu_{ki} - \mu_{ki}^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;  либо  &amp;lt;math&amp;gt;\max_{i = \overline{1,c}} {( \left | V_i - V_i^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mu_{ki}^* (V_i^*)&amp;lt;/math&amp;gt; – значение &amp;lt;math&amp;gt;\mu_{ki}(V_i)&amp;lt;/math&amp;gt;, вычисленное на предыдущей итерации.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Вычислительное ядро алгоритма Fuzzy C-Means составляют шаги вычисления центров кластеров, расстояний между ними и точками данных и в особенности пересчёта матрицы степеней принадлежности точек данных.&lt;br /&gt;
&lt;br /&gt;
При реальном вычислении некоторые повторяющиеся вычисления могут быть устранены. Так, для шага вычисления центров кластеров величины &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; могут вычисляться однократно и умножаться на &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt; при включении в сумму, записанную в числителе. Для шага вычисления расстояний между центрами кластеров и точками, операция взятия квадратного корня не является обязательной, так как в дальнейшем на шаге вычисления степеней принадлежности можно непосредственно использовать квадраты этих расстояний, и сумма в знаменателе будет приобретать вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum^{c}_{j=1} {\left ( \frac{D_{ki} ^ {2}}{D_{kj} ^ {2}} \right )}^{{1}/{m-1}}&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;
Инициализация происходит случайным заполнением матрицы принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; с соблюдением условия нормировки &amp;lt;math&amp;gt;\sum_{i=1}^c {\mu_{ki} =1}&amp;lt;/math&amp;gt; и переходом к шагу 1, либо случайным определением центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt; и переходом к шагу 2.&lt;br /&gt;
&lt;br /&gt;
Далее осуществляются итерации следующего вида:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;V_i=\frac{\sum_{k=1}^{M} {\mu_{ki}^m * X_k}}{\sum_{k=1}^{M} {\mu_{ki}^m} },i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} {\left ( \frac{D_{ki}}{D_{kj}} \right )} }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конце каждой итерации проверяется условие останова вида &amp;lt;math&amp;gt;\max_{k = \overline{1,M},i = \overline{1,c}} {( \left | \mu_{ki} - \mu_{ki}^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, либо &amp;lt;math&amp;gt;\max_{i = \overline{1,c}} {( \left | V_i - V_i^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mu_{ki}^* (V_i^*)&amp;lt;/math&amp;gt; – значение &amp;lt;math&amp;gt;\mu_{ki}(V_i)&amp;lt;/math&amp;gt;, вычисленное на предыдущей итерации. Если условие не выполнено, осуществляется переход к шагу 1.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
При кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; объектов данных, представленных точками в &amp;lt;math&amp;gt;\R^n&amp;lt;/math&amp;gt;, на &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; кластеров, алгоритм Fuzzy C-Means в последовательном варианте имеет вычислительную сложность – &amp;lt;math&amp;gt;O(c^2 MI+cMnI)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; – число итераций. Если считать размерность данных &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; малой, то эта сложность сводится к &amp;lt;math&amp;gt;O(c^2 MI)&amp;lt;/math&amp;gt;. Основной частью алгоритма в этом случае является пересчёт матрицы принадлежностей, требующий вычисления &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt; сумм из &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; слагаемых на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Приведём граф единичной итерации алгоритма в параллельном оптимизированном варианте (метод распараллеливания взят в &amp;lt;ref&amp;gt;Kwok, T., Smith, K.,&lt;br /&gt;
Lozano, S., Taniar, D.: [http://num-meth.srcc.msu.ru/zhurnal/tom_2012/pdf/v13r207.pdf Parallel Fuzzy c-Means Clustering for Large Data Sets], последнее обращение 25.10.2016&amp;lt;/ref&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
[[File:C-means_paralle_graph.png|thumb|upright=2.5|frame|center|alt=Paralel Fuzzy C-Means|Каждая вершина данного графа соответствует операциям из алгоритма, указанным при помощи указанных формул. Каждый из p столбцов соответствует работе одного из процессов. Пометки справа указывают число повторений каждого узла в ходе одной итерации.]]&lt;br /&gt;
&lt;br /&gt;
Раздел 1.8 уточняет, соответствуют ли эти повторения однотипным ярусам или точкам данных, вычисления для которых можно распараллелить и далее.&lt;br /&gt;
&lt;br /&gt;
Каждый процесс обладает следующими данными:&lt;br /&gt;
* координатами точек данных &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p}+1)}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;rnk&amp;lt;/math&amp;gt; – номер процесса,&lt;br /&gt;
* значениями &amp;lt;math&amp;gt;\mu_{ki}&amp;lt;/math&amp;gt; степени принадлежности для своих точек (&amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p} +1)}, i=\overline{1,c}&amp;lt;/math&amp;gt;),&lt;br /&gt;
* координатами центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=\overline{1,c}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Суммы &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m X_k}&amp;lt;/math&amp;gt; вычисляются одновременно, поэтому значения &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; вычисляются по одному разу за итерацию. Таким образом, второй ярус операций на рисунке на деле не содержит операций возведения в степень.&lt;br /&gt;
За счёт линейности большинства выражений относительно данных по точкам, процессы взаимодействуют только при редукции сумм, составляющих &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;. Всё остальное время каждый процессор работает только со своими &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точками. Это обеспечивает применимость алгоритма для больших &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
При распараллеливании по точкам исходных данных и условии останову по малому изменению степеней принадлежности выполнение одной итерации алгоритма FCM может быть разделено на следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм знаменателя (по &amp;lt;math&amp;gt;\frac{M}{p}-1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; операций возведения в степень на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм числителя (по &amp;lt;math&amp;gt;\frac{M}{p} -1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; умножений на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; редукция сумм и передач значений &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt; процессам (получение &amp;lt;math&amp;gt;2c&amp;lt;/math&amp;gt; значений, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; делений),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&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; умножений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов вычисления степеней принадлежности точек (по &amp;lt;math&amp;gt;c+1&amp;lt;/math&amp;gt; делений, c возведений в степень, &amp;lt;math&amp;gt;c-1&amp;lt;/math&amp;gt; сложений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* до &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов проверки условий останова (по &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; вычитанию, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; сравнению), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; редукция для обмена статусом завершения.&lt;br /&gt;
Таким образом, при распараллеливании по точкам исходных данных при условии наличия в каждом узле достаточного объёма памяти для хранения всего массива координат центров кластеров высота и ширина ЯПФ алгоритма FCM равны соответственно &amp;lt;math&amp;gt;O(c^2 I+cnI)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: массив векторов &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt;, число кластеров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt; для входных векторов, 3 вспомогательных параметра.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;). Условие нормировки: &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
В случае неограниченного распараллеливания по точкам данных (1 процесс на точку), отношение последовательной сложности алгоритма к параллельной пропорционально &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; задаёт степень «размытости» кластеров. В отсутствие априорных данных его обычно берут равным 2. В предельном случае сведения параметра &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; к значению 1, кластеры становятся чёткими и алгоритм вырождается в алгоритм кластеризации K-Means.&lt;br /&gt;
&lt;br /&gt;
Алгоритм недетерминирован, начальное положение кластеров задаётся случайно либо явно, либо опосредованно (через матрицу принадлежности). Алгоритм сходится к локальному экстремуму &amp;lt;ref&amp;gt;Höppner, F., Klawonn, F.: [https://public.fh wolfenbuettel.de/~klawonn/Papers/hoeppnerklawonntfs03.pdf A Contribution to Convergence Theory of Fuzzy c-Means and Derivatives], Дата последнего обращения: 13.10.2016&amp;lt;/ref&amp;gt; и, таким образом, не гарантирует оптимальный результат при случайном выборе начальных значений.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
* пакет MATLAB &amp;lt;ref&amp;gt;[http://www.mathworks.com/help/fuzzy/fcm.html Документация пакета MATLAB, функция fcm], последнее обращение 15.10.2016&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Реализация алгоритма на POSTGRESQL &amp;lt;ref&amp;gt;[http://num-meth.srcc.msu.ru/zhurnal/tom_2012/pdf/v13r207.pdf Реализация алгоритма Fuzzy C-means на POSTGRESQL], последнее обращение 15.10.2016&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en:Parallel Fuzzy c-Means Clustering]]&lt;/div&gt;</summary>
		<author><name>Illusive mike</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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=13756</id>
		<title>Участник:Nikmedoed/Нечеткий алгоритм С-средних (Fuzzy 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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=13756"/>
		<updated>2016-10-25T15:37:45Z</updated>

		<summary type="html">&lt;p&gt;Illusive mike: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нечеткий алгоритм С-средних (Fuzzy C-means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(c^2 MI + cMnI), (I&amp;lt;/math&amp;gt; - число итераций, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - число точек, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - размерность точек (свойств на объект)&amp;lt;math&amp;gt;)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(c^2 I + cnI)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O( M )&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Выполняют: [[Участник:Nikmedoed|Н.А. Муромцев]] - перенос в вики, раздел 2, картинки, [[Участник:illusive_mike|М.С. Дворецкий]] - раздел 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Нечеткий алгоритм С-средних&#039;&#039;&#039; (&#039;&#039;Fuzzy C-means&#039;&#039;) - позволяет получить нечёткую кластеризацию больших наборов числовых данных, что позволяет корректно определять объекты на границах кластеров. Однако, выполнение данного алгоритма требует серьёзных вычислительных ресурсов, а также изначального задания количества кластеров. Кроме того, может возникнуть неоднозначность с объектами, удалёнными от центров всех кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм кластеризации Fuzzy C-Means (FCM) был предложен Дж. Данном в 1973 году &amp;lt;ref&amp;gt;Dunn, J.C.: A Fuzzy Relative of the ISODATA Process and Its Use in Detecting Compact Well-Separated Clusters. Journal of Cybernetics. 3 (1973): 32–57&amp;lt;/ref&amp;gt; и доработан Дж. Бездеком в 1981 году &amp;lt;ref&amp;gt;Bezdek, J.C.: Pattern Recognition with Fuzzy Objective Function Algorithms. Plenum Press, New York (1981). ISBN 0-306-40671-3&amp;lt;/ref&amp;gt;. В отличие от большинства существующих алгоритмов кластеризации, данный алгоритм является нечётким – каждый из объектов не входит однозначно в какой-либо кластер, а принадлежит всем кластерам с различными степенями принадлежности. Это даёт преимущества в качестве разбиения в случаях, когда кластеры находятся близко друг к другу, и большое число точек находится на их границах. Однако ценой такой нечёткости служат большие вычислительные затраты, чем у таких чётких алгоритмов, как [[Hard C-Means]] и [[K-Means]], при сохранении таких их недостатков, как априорное определение числа кластеров и отсутствие гарантии глобальной оптимальности результата.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Исходные данные: массив объектов &amp;lt;math&amp;gt;{X_k}\in{\R^n}, k=\overline{1,M}&amp;lt;/math&amp;gt;, число кластеров c, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица разбиения &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;M\times c&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;), центры кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, расстояния &amp;lt;math&amp;gt;D_{ki}&amp;lt;/math&amp;gt; между объектами и центрами кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода (вычисляются последовательно на каждой итерации):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Уточнение центров кластеров по степеням принадлежности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;V_i=\frac{\sum^{M}_{k=1} {\mu^m_{ki} * X_k}}{\sum^{M}_{k=1} {\mu^m_{ki}}},i=\overline{1,c}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
2. Расчёт расстояний между новыми центрами кластеров и точками данных&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
3. Пересчёт степеней принадлежности объектов кластерам&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} \left ( {\frac{D_{ki}}{D_{kj}}} \right ) }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждой итерации алгоритма происходит уточнение элементов матрицы &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Выходом алгоритма служит матрица &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, к которой алгоритм сходится. Факт того, что алгоритм сошёлся, устанавливается проверкой вида &amp;lt;math&amp;gt;\max_{k = \overline{1,M},i = \overline{1,c}} {( \left | \mu_{ki} - \mu_{ki}^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;  либо  &amp;lt;math&amp;gt;\max_{i = \overline{1,c}} {( \left | V_i - V_i^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mu_{ki}^* (V_i^*)&amp;lt;/math&amp;gt; – значение &amp;lt;math&amp;gt;\mu_{ki}(V_i)&amp;lt;/math&amp;gt;, вычисленное на предыдущей итерации.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Вычислительное ядро алгоритма Fuzzy C-Means составляют шаги вычисления центров кластеров, расстояний между ними и точками данных и в особенности пересчёта матрицы степеней принадлежности точек данных.&lt;br /&gt;
&lt;br /&gt;
При реальном вычислении некоторые повторяющиеся вычисления могут быть устранены. Так, для шага вычисления центров кластеров величины &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; могут вычисляться однократно и умножаться на &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt; при включении в сумму, записанную в числителе. Для шага вычисления расстояний между центрами кластеров и точками, операция взятия квадратного корня не является обязательной, так как в дальнейшем на шаге вычисления степеней принадлежности можно непосредственно использовать квадраты этих расстояний, и сумма в знаменателе будет приобретать вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum^{c}_{j=1} {\left ( \frac{D_{ki} ^ {2}}{D_{kj} ^ {2}} \right )}^{{1}/{m-1}}&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;
Инициализация происходит случайным заполнением матрицы принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; с соблюдением условия нормировки &amp;lt;math&amp;gt;\sum_{i=1}^c {\mu_{ki} =1}&amp;lt;/math&amp;gt; и переходом к шагу 1, либо случайным определением центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt; и переходом к шагу 2.&lt;br /&gt;
&lt;br /&gt;
Далее осуществляются итерации следующего вида:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;V_i=\frac{\sum_{k=1}^{M} {\mu_{ki}^m * X_k}}{\sum_{k=1}^{M} {\mu_{ki}^m} },i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} {\left ( \frac{D_{ki}}{D_{kj}} \right )} }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конце каждой итерации проверяется условие останова вида &amp;lt;math&amp;gt;\max_{k = \overline{1,M},i = \overline{1,c}} {( \left | \mu_{ki} - \mu_{ki}^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, либо &amp;lt;math&amp;gt;\max_{i = \overline{1,c}} {( \left | V_i - V_i^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mu_{ki}^* (V_i^*)&amp;lt;/math&amp;gt; – значение &amp;lt;math&amp;gt;\mu_{ki}(V_i)&amp;lt;/math&amp;gt;, вычисленное на предыдущей итерации. Если условие не выполнено, осуществляется переход к шагу 1.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
При кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; объектов данных, представленных точками в &amp;lt;math&amp;gt;\R^n&amp;lt;/math&amp;gt;, на &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; кластеров, алгоритм Fuzzy C-Means в последовательном варианте имеет вычислительную сложность – &amp;lt;math&amp;gt;O(c^2 MI+cMnI)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; – число итераций. Если считать размерность данных &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; малой, то эта сложность сводится к &amp;lt;math&amp;gt;O(c^2 MI)&amp;lt;/math&amp;gt;. Основной частью алгоритма в этом случае является пересчёт матрицы принадлежностей, требующий вычисления &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt; сумм из &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; слагаемых на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Приведём граф единичной итерации алгоритма в параллельном оптимизированном варианте (метод распараллеливания взят в &amp;lt;ref&amp;gt;Kwok, T., Smith, K.,&lt;br /&gt;
Lozano, S., Taniar, D.: [http://num-meth.srcc.msu.ru/zhurnal/tom_2012/pdf/v13r207.pdf Parallel Fuzzy c-Means Clustering for Large Data Sets], последнее обращение 25.10.2016&amp;lt;/ref&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
[[File:C-means_paralle_graph.png|thumb|upright=2.5|frame|center|alt=Paralel Fuzzy C-Means|Каждая вершина данного графа соответствует операциям из алгоритма, указанным при помощи указанных формул. Каждый из p столбцов соответствует работе одного из процессов. Пометки справа указывают число повторений каждого узла в ходе одной итерации.]]&lt;br /&gt;
&lt;br /&gt;
Раздел 1.8 уточняет, соответствуют ли эти повторения однотипным ярусам или точкам данных, вычисления для которых можно распараллелить и далее.&lt;br /&gt;
&lt;br /&gt;
Каждый процесс обладает следующими данными:&lt;br /&gt;
* координатами точек данных &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p}+1)}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;rnk&amp;lt;/math&amp;gt; – номер процесса,&lt;br /&gt;
* значениями &amp;lt;math&amp;gt;\mu_{ki}&amp;lt;/math&amp;gt; степени принадлежности для своих точек (&amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p} +1)}, i=\overline{1,c}&amp;lt;/math&amp;gt;),&lt;br /&gt;
* координатами центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=\overline{1,c}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Суммы &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m X_k}&amp;lt;/math&amp;gt; вычисляются одновременно, поэтому значения &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; вычисляются по одному разу за итерацию. Таким образом, второй ярус операций на рисунке на деле не содержит операций возведения в степень.&lt;br /&gt;
За счёт линейности большинства выражений относительно данных по точкам, процессы взаимодействуют только при редукции сумм, составляющих &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;. Всё остальное время каждый процессор работает только со своими &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точками. Это обеспечивает применимость алгоритма для больших &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
При распараллеливании по точкам исходных данных и условии останову по малому изменению степеней принадлежности выполнение одной итерации алгоритма FCM может быть разделено на следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм знаменателя (по &amp;lt;math&amp;gt;\frac{M}{p}-1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; операций возведения в степень на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм числителя (по &amp;lt;math&amp;gt;\frac{M}{p} -1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; умножений на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; редукций сумм и передач значений &amp;lt;math&amp;gt;V_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;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; умножений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов вычисления степеней принадлежности точек (по &amp;lt;math&amp;gt;c+1&amp;lt;/math&amp;gt; делений, c возведений в степень, &amp;lt;math&amp;gt;c-1&amp;lt;/math&amp;gt; сложений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* до &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов проверки условий останова (по &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; вычитанию, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; сравнению), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; редукция для обмена статусом завершения.&lt;br /&gt;
Таким образом, при распараллеливании по точкам исходных данных при условии наличия в каждом узле достаточного объёма памяти для хранения всего массива координат центров кластеров высота и ширина ЯПФ алгоритма FCM равны соответственно &amp;lt;math&amp;gt;O(c^2 I+cnI)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: массив векторов &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt;, число кластеров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt; для входных векторов, 3 вспомогательных параметра.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;). Условие нормировки: &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
В случае неограниченного распараллеливания по точкам данных (1 процесс на точку), отношение последовательной сложности алгоритма к параллельной пропорционально &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; задаёт степень «размытости» кластеров. В отсутствие априорных данных его обычно берут равным 2. В предельном случае сведения параметра &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; к значению 1, кластеры становятся чёткими и алгоритм вырождается в алгоритм кластеризации K-Means.&lt;br /&gt;
&lt;br /&gt;
Алгоритм недетерминирован, начальное положение кластеров задаётся случайно либо явно, либо опосредованно (через матрицу принадлежности). Алгоритм сходится к локальному экстремуму &amp;lt;ref&amp;gt;Höppner, F., Klawonn, F.: [https://public.fh wolfenbuettel.de/~klawonn/Papers/hoeppnerklawonntfs03.pdf A Contribution to Convergence Theory of Fuzzy c-Means and Derivatives], Дата последнего обращения: 13.10.2016&amp;lt;/ref&amp;gt; и, таким образом, не гарантирует оптимальный результат при случайном выборе начальных значений.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
* пакет MATLAB &amp;lt;ref&amp;gt;[http://www.mathworks.com/help/fuzzy/fcm.html Документация пакета MATLAB, функция fcm], последнее обращение 15.10.2016&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Реализация алгоритма на POSTGRESQL &amp;lt;ref&amp;gt;[http://num-meth.srcc.msu.ru/zhurnal/tom_2012/pdf/v13r207.pdf Реализация алгоритма Fuzzy C-means на POSTGRESQL], последнее обращение 15.10.2016&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en:Parallel Fuzzy c-Means Clustering]]&lt;/div&gt;</summary>
		<author><name>Illusive mike</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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=13754</id>
		<title>Участник:Nikmedoed/Нечеткий алгоритм С-средних (Fuzzy 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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=13754"/>
		<updated>2016-10-25T15:37:01Z</updated>

		<summary type="html">&lt;p&gt;Illusive mike: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нечеткий алгоритм С-средних (Fuzzy C-means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(c^2 MI + cMnI), (I&amp;lt;/math&amp;gt; - число итераций, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - число точек, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - размерность точек (свойств на объект)&amp;lt;math&amp;gt;)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(c^2 I + cnI)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O( M )&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Выполняют: [[Участник:Nikmedoed|Н.А. Муромцев]] - перенос в вики, раздел 2, картинки, [[Участник:illusive_mike|М.С. Дворецкий]] - раздел 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Нечеткий алгоритм С-средних&#039;&#039;&#039; (&#039;&#039;Fuzzy C-means&#039;&#039;) - позволяет получить нечёткую кластеризацию больших наборов числовых данных, что позволяет корректно определять объекты на границах кластеров. Однако, выполнение данного алгоритма требует серьёзных вычислительных ресурсов, а также изначального задания количества кластеров. Кроме того, может возникнуть неоднозначность с объектами, удалёнными от центров всех кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм кластеризации Fuzzy C-Means (FCM) был предложен Дж. Данном в 1973 году &amp;lt;ref&amp;gt;Dunn, J.C.: A Fuzzy Relative of the ISODATA Process and Its Use in Detecting Compact Well-Separated Clusters. Journal of Cybernetics. 3 (1973): 32–57&amp;lt;/ref&amp;gt; и доработан Дж. Бездеком в 1981 году &amp;lt;ref&amp;gt;Bezdek, J.C.: Pattern Recognition with Fuzzy Objective Function Algorithms. Plenum Press, New York (1981). ISBN 0-306-40671-3&amp;lt;/ref&amp;gt;. В отличие от большинства существующих алгоритмов кластеризации, данный алгоритм является нечётким – каждый из объектов не входит однозначно в какой-либо кластер, а принадлежит всем кластерам с различными степенями принадлежности. Это даёт преимущества в качестве разбиения в случаях, когда кластеры находятся близко друг к другу, и большое число точек находится на их границах. Однако ценой такой нечёткости служат большие вычислительные затраты, чем у таких чётких алгоритмов, как [[Hard C-Means]] и [[K-Means]], при сохранении таких их недостатков, как априорное определение числа кластеров и отсутствие гарантии глобальной оптимальности результата.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Исходные данные: массив объектов &amp;lt;math&amp;gt;{X_k}\in{\R^n}, k=\overline{1,M}&amp;lt;/math&amp;gt;, число кластеров c, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица разбиения &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;M\times c&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;), центры кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, расстояния &amp;lt;math&amp;gt;D_{ki}&amp;lt;/math&amp;gt; между объектами и центрами кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода (вычисляются последовательно на каждой итерации):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Уточнение центров кластеров по степеням принадлежности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;V_i=\frac{\sum^{M}_{k=1} {\mu^m_{ki} * X_k}}{\sum^{M}_{k=1} {\mu^m_{ki}}},i=\overline{1,c}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
2. Расчёт расстояний между новыми центрами кластеров и точками данных&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
3. Пересчёт степеней принадлежности объектов кластерам&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} \left ( {\frac{D_{ki}}{D_{kj}}} \right ) }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждой итерации алгоритма происходит уточнение элементов матрицы &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Выходом алгоритма служит матрица &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, к которой алгоритм сходится. Факт того, что алгоритм сошёлся, устанавливается проверкой вида &amp;lt;math&amp;gt;\max_{k = \overline{1,M},i = \overline{1,c}} {( \left | \mu_{ki} - \mu_{ki}^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;  либо  &amp;lt;math&amp;gt;\max_{i = \overline{1,c}} {( \left | V_i - V_i^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mu_{ki}^* (V_i^*)&amp;lt;/math&amp;gt; – значение &amp;lt;math&amp;gt;\mu_{ki}(V_i)&amp;lt;/math&amp;gt;, вычисленное на предыдущей итерации.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Вычислительное ядро алгоритма Fuzzy C-Means составляют шаги вычисления центров кластеров, расстояний между ними и точками данных и в особенности пересчёта матрицы степеней принадлежности точек данных.&lt;br /&gt;
&lt;br /&gt;
При реальном вычислении некоторые повторяющиеся вычисления могут быть устранены. Так, для шага вычисления центров кластеров величины &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; могут вычисляться однократно и умножаться на &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt; при включении в сумму, записанную в числителе. Для шага вычисления расстояний между центрами кластеров и точками, операция взятия квадратного корня не является обязательной, так как в дальнейшем на шаге вычисления степеней принадлежности можно непосредственно использовать квадраты этих расстояний, и сумма в знаменателе будет приобретать вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum^{c}_{j=1} {\left ( \frac{D_{ki} ^ {2}}{D_{kj} ^ {2}} \right )}^{{1}/{m-1}}&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;
Инициализация происходит случайным заполнением матрицы принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; с соблюдением условия нормировки &amp;lt;math&amp;gt;\sum_{i=1}^c {\mu_{ki} =1}&amp;lt;/math&amp;gt; и переходом к шагу 1, либо случайным определением центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt; и переходом к шагу 2.&lt;br /&gt;
&lt;br /&gt;
Далее осуществляются итерации следующего вида:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;V_i=\frac{\sum_{k=1}^{M} {\mu_{ki}^m * X_k}}{\sum_{k=1}^{M} {\mu_{ki}^m} },i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} {\left ( \frac{D_{ki}}{D_{kj}} \right )} }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конце каждой итерации проверяется условие останова вида &amp;lt;math&amp;gt;\max_{k = \overline{1,M},i = \overline{1,c}} {( \left | \mu_{ki} - \mu_{ki}^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, либо &amp;lt;math&amp;gt;\max_{i = \overline{1,c}} {( \left | V_i - V_i^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mu_{ki}^* (V_i^*)&amp;lt;/math&amp;gt; – значение &amp;lt;math&amp;gt;\mu_{ki}(V_i)&amp;lt;/math&amp;gt;, вычисленное на предыдущей итерации. Если условие не выполнено, осуществляется переход к шагу 1.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
При кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; объектов данных, представленных точками в &amp;lt;math&amp;gt;\R^n&amp;lt;/math&amp;gt;, на &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; кластеров, алгоритм Fuzzy C-Means в последовательном варианте имеет вычислительную сложность – &amp;lt;math&amp;gt;O(c^2 MI+cMnI)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; – число итераций. Если считать размерность данных &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; малой, то эта сложность сводится к &amp;lt;math&amp;gt;O(c^2 MI)&amp;lt;/math&amp;gt;. Основной частью алгоритма в этом случае является пересчёт матрицы принадлежностей, требующий вычисления &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt; сумм из &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; слагаемых на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Приведём граф единичной итерации алгоритма в параллельном оптимизированном варианте (метод распараллеливания взят в &amp;lt;ref&amp;gt; [http://num-meth.srcc.msu.ru/zhurnal/tom_2012/pdf/v13r207.pdf Kwok, T., Smith, K.,&lt;br /&gt;
Lozano, S., Taniar, D.: Parallel Fuzzy c-Means Clustering for Large Data Sets], последнее обращение 25.10.2016&amp;lt;/ref&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
[[File:C-means_paralle_graph.png|thumb|upright=2.5|frame|center|alt=Paralel Fuzzy C-Means|Каждая вершина данного графа соответствует операциям из алгоритма, указанным при помощи указанных формул. Каждый из p столбцов соответствует работе одного из процессов. Пометки справа указывают число повторений каждого узла в ходе одной итерации.]]&lt;br /&gt;
&lt;br /&gt;
Раздел 1.8 уточняет, соответствуют ли эти повторения однотипным ярусам или точкам данных, вычисления для которых можно распараллелить и далее.&lt;br /&gt;
&lt;br /&gt;
Каждый процесс обладает следующими данными:&lt;br /&gt;
* координатами точек данных &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p}+1)}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;rnk&amp;lt;/math&amp;gt; – номер процесса,&lt;br /&gt;
* значениями &amp;lt;math&amp;gt;\mu_{ki}&amp;lt;/math&amp;gt; степени принадлежности для своих точек (&amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p} +1)}, i=\overline{1,c}&amp;lt;/math&amp;gt;),&lt;br /&gt;
* координатами центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=\overline{1,c}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Суммы &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m X_k}&amp;lt;/math&amp;gt; вычисляются одновременно, поэтому значения &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; вычисляются по одному разу за итерацию. Таким образом, второй ярус операций на рисунке на деле не содержит операций возведения в степень.&lt;br /&gt;
За счёт линейности большинства выражений относительно данных по точкам, процессы взаимодействуют только при редукции сумм, составляющих &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;. Всё остальное время каждый процессор работает только со своими &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точками. Это обеспечивает применимость алгоритма для больших &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
При распараллеливании по точкам исходных данных и условии останову по малому изменению степеней принадлежности выполнение одной итерации алгоритма FCM может быть разделено на следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм знаменателя (по &amp;lt;math&amp;gt;\frac{M}{p}-1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; операций возведения в степень на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм числителя (по &amp;lt;math&amp;gt;\frac{M}{p} -1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; умножений на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; редукций сумм и передач значений &amp;lt;math&amp;gt;V_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;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; умножений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов вычисления степеней принадлежности точек (по &amp;lt;math&amp;gt;c+1&amp;lt;/math&amp;gt; делений, c возведений в степень, &amp;lt;math&amp;gt;c-1&amp;lt;/math&amp;gt; сложений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* до &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов проверки условий останова (по &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; вычитанию, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; сравнению), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; редукция для обмена статусом завершения.&lt;br /&gt;
Таким образом, при распараллеливании по точкам исходных данных при условии наличия в каждом узле достаточного объёма памяти для хранения всего массива координат центров кластеров высота и ширина ЯПФ алгоритма FCM равны соответственно &amp;lt;math&amp;gt;O(c^2 I+cnI)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: массив векторов &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt;, число кластеров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt; для входных векторов, 3 вспомогательных параметра.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;). Условие нормировки: &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
В случае неограниченного распараллеливания по точкам данных (1 процесс на точку), отношение последовательной сложности алгоритма к параллельной пропорционально &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; задаёт степень «размытости» кластеров. В отсутствие априорных данных его обычно берут равным 2. В предельном случае сведения параметра &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; к значению 1, кластеры становятся чёткими и алгоритм вырождается в алгоритм кластеризации K-Means.&lt;br /&gt;
&lt;br /&gt;
Алгоритм недетерминирован, начальное положение кластеров задаётся случайно либо явно, либо опосредованно (через матрицу принадлежности). Алгоритм сходится к локальному экстремуму &amp;lt;ref&amp;gt;Höppner, F., Klawonn, F.: [https://public.fh wolfenbuettel.de/~klawonn/Papers/hoeppnerklawonntfs03.pdf A Contribution to Convergence Theory of Fuzzy c-Means and Derivatives], Дата последнего обращения: 13.10.2016&amp;lt;/ref&amp;gt; и, таким образом, не гарантирует оптимальный результат при случайном выборе начальных значений.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
* пакет MATLAB &amp;lt;ref&amp;gt;[http://www.mathworks.com/help/fuzzy/fcm.html Документация пакета MATLAB, функция fcm], последнее обращение 15.10.2016&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Реализация алгоритма на POSTGRESQL &amp;lt;ref&amp;gt;[http://num-meth.srcc.msu.ru/zhurnal/tom_2012/pdf/v13r207.pdf Реализация алгоритма Fuzzy C-means на POSTGRESQL], последнее обращение 15.10.2016&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en:Parallel Fuzzy c-Means Clustering]]&lt;/div&gt;</summary>
		<author><name>Illusive mike</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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=13753</id>
		<title>Участник:Nikmedoed/Нечеткий алгоритм С-средних (Fuzzy 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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=13753"/>
		<updated>2016-10-25T15:36:06Z</updated>

		<summary type="html">&lt;p&gt;Illusive mike: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нечеткий алгоритм С-средних (Fuzzy C-means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(c^2 MI + cMnI), (I&amp;lt;/math&amp;gt; - число итераций, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - число точек, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - размерность точек (свойств на объект)&amp;lt;math&amp;gt;)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(c^2 I + cnI)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O( M )&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Выполняют: [[Участник:Nikmedoed|Н.А. Муромцев]] - перенос в вики, раздел 2, картинки, [[Участник:illusive_mike|М.С. Дворецкий]] - раздел 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Нечеткий алгоритм С-средних&#039;&#039;&#039; (&#039;&#039;Fuzzy C-means&#039;&#039;) - позволяет получить нечёткую кластеризацию больших наборов числовых данных, что позволяет корректно определять объекты на границах кластеров. Однако, выполнение данного алгоритма требует серьёзных вычислительных ресурсов, а также изначального задания количества кластеров. Кроме того, может возникнуть неоднозначность с объектами, удалёнными от центров всех кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм кластеризации Fuzzy C-Means (FCM) был предложен Дж. Данном в 1973 году &amp;lt;ref&amp;gt;Dunn, J.C.: A Fuzzy Relative of the ISODATA Process and Its Use in Detecting Compact Well-Separated Clusters. Journal of Cybernetics. 3 (1973): 32–57&amp;lt;/ref&amp;gt; и доработан Дж. Бездеком в 1981 году &amp;lt;ref&amp;gt;Bezdek, J.C.: Pattern Recognition with Fuzzy Objective Function Algorithms. Plenum Press, New York (1981). ISBN 0-306-40671-3&amp;lt;/ref&amp;gt;. В отличие от большинства существующих алгоритмов кластеризации, данный алгоритм является нечётким – каждый из объектов не входит однозначно в какой-либо кластер, а принадлежит всем кластерам с различными степенями принадлежности. Это даёт преимущества в качестве разбиения в случаях, когда кластеры находятся близко друг к другу, и большое число точек находится на их границах. Однако ценой такой нечёткости служат большие вычислительные затраты, чем у таких чётких алгоритмов, как [[Hard C-Means]] и [[K-Means]], при сохранении таких их недостатков, как априорное определение числа кластеров и отсутствие гарантии глобальной оптимальности результата.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Исходные данные: массив объектов &amp;lt;math&amp;gt;{X_k}\in{\R^n}, k=\overline{1,M}&amp;lt;/math&amp;gt;, число кластеров c, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица разбиения &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;M\times c&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;), центры кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, расстояния &amp;lt;math&amp;gt;D_{ki}&amp;lt;/math&amp;gt; между объектами и центрами кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода (вычисляются последовательно на каждой итерации):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Уточнение центров кластеров по степеням принадлежности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;V_i=\frac{\sum^{M}_{k=1} {\mu^m_{ki} * X_k}}{\sum^{M}_{k=1} {\mu^m_{ki}}},i=\overline{1,c}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
2. Расчёт расстояний между новыми центрами кластеров и точками данных&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
3. Пересчёт степеней принадлежности объектов кластерам&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} \left ( {\frac{D_{ki}}{D_{kj}}} \right ) }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждой итерации алгоритма происходит уточнение элементов матрицы &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Выходом алгоритма служит матрица &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, к которой алгоритм сходится. Факт того, что алгоритм сошёлся, устанавливается проверкой вида &amp;lt;math&amp;gt;\max_{k = \overline{1,M},i = \overline{1,c}} {( \left | \mu_{ki} - \mu_{ki}^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;  либо  &amp;lt;math&amp;gt;\max_{i = \overline{1,c}} {( \left | V_i - V_i^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mu_{ki}^* (V_i^*)&amp;lt;/math&amp;gt; – значение &amp;lt;math&amp;gt;\mu_{ki}(V_i)&amp;lt;/math&amp;gt;, вычисленное на предыдущей итерации.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Вычислительное ядро алгоритма Fuzzy C-Means составляют шаги вычисления центров кластеров, расстояний между ними и точками данных и в особенности пересчёта матрицы степеней принадлежности точек данных.&lt;br /&gt;
&lt;br /&gt;
При реальном вычислении некоторые повторяющиеся вычисления могут быть устранены. Так, для шага вычисления центров кластеров величины &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; могут вычисляться однократно и умножаться на &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt; при включении в сумму, записанную в числителе. Для шага вычисления расстояний между центрами кластеров и точками, операция взятия квадратного корня не является обязательной, так как в дальнейшем на шаге вычисления степеней принадлежности можно непосредственно использовать квадраты этих расстояний, и сумма в знаменателе будет приобретать вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum^{c}_{j=1} {\left ( \frac{D_{ki} ^ {2}}{D_{kj} ^ {2}} \right )}^{{1}/{m-1}}&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;
Инициализация происходит случайным заполнением матрицы принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; с соблюдением условия нормировки &amp;lt;math&amp;gt;\sum_{i=1}^c {\mu_{ki} =1}&amp;lt;/math&amp;gt; и переходом к шагу 1, либо случайным определением центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt; и переходом к шагу 2.&lt;br /&gt;
&lt;br /&gt;
Далее осуществляются итерации следующего вида:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;V_i=\frac{\sum_{k=1}^{M} {\mu_{ki}^m * X_k}}{\sum_{k=1}^{M} {\mu_{ki}^m} },i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} {\left ( \frac{D_{ki}}{D_{kj}} \right )} }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конце каждой итерации проверяется условие останова вида &amp;lt;math&amp;gt;\max_{k = \overline{1,M},i = \overline{1,c}} {( \left | \mu_{ki} - \mu_{ki}^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, либо &amp;lt;math&amp;gt;\max_{i = \overline{1,c}} {( \left | V_i - V_i^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mu_{ki}^* (V_i^*)&amp;lt;/math&amp;gt; – значение &amp;lt;math&amp;gt;\mu_{ki}(V_i)&amp;lt;/math&amp;gt;, вычисленное на предыдущей итерации. Если условие не выполнено, осуществляется переход к шагу 1.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
При кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; объектов данных, представленных точками в &amp;lt;math&amp;gt;\R^n&amp;lt;/math&amp;gt;, на &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; кластеров, алгоритм Fuzzy C-Means в последовательном варианте имеет вычислительную сложность – &amp;lt;math&amp;gt;O(c^2 MI+cMnI)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; – число итераций. Если считать размерность данных &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; малой, то эта сложность сводится к &amp;lt;math&amp;gt;O(c^2 MI)&amp;lt;/math&amp;gt;. Основной частью алгоритма в этом случае является пересчёт матрицы принадлежностей, требующий вычисления &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt; сумм из &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; слагаемых на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Приведём граф единичной итерации алгоритма в параллельном оптимизированном варианте (метод распараллеливания взят в &amp;lt;ref&amp;gt;[http://num-meth.srcc.msu.ru/zhurnal/tom_2012/pdf/v13r207.pdf Kwok, T., Smith, K.,&lt;br /&gt;
Lozano, S., Taniar, D.: Parallel Fuzzy c-Means Clustering for Large Data Sets], последнее обращение 25.10.2016&amp;lt;/ref&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
[[File:C-means_paralle_graph.png|thumb|upright=2.5|frame|center|alt=Paralel Fuzzy C-Means|Каждая вершина данного графа соответствует операциям из алгоритма, указанным при помощи указанных формул. Каждый из p столбцов соответствует работе одного из процессов. Пометки справа указывают число повторений каждого узла в ходе одной итерации.]]&lt;br /&gt;
&lt;br /&gt;
Раздел 1.8 уточняет, соответствуют ли эти повторения однотипным ярусам или точкам данных, вычисления для которых можно распараллелить и далее.&lt;br /&gt;
&lt;br /&gt;
Каждый процесс обладает следующими данными:&lt;br /&gt;
* координатами точек данных &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p}+1)}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;rnk&amp;lt;/math&amp;gt; – номер процесса,&lt;br /&gt;
* значениями &amp;lt;math&amp;gt;\mu_{ki}&amp;lt;/math&amp;gt; степени принадлежности для своих точек (&amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p} +1)}, i=\overline{1,c}&amp;lt;/math&amp;gt;),&lt;br /&gt;
* координатами центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=\overline{1,c}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Суммы &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m X_k}&amp;lt;/math&amp;gt; вычисляются одновременно, поэтому значения &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; вычисляются по одному разу за итерацию. Таким образом, второй ярус операций на рисунке на деле не содержит операций возведения в степень.&lt;br /&gt;
За счёт линейности большинства выражений относительно данных по точкам, процессы взаимодействуют только при редукции сумм, составляющих &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;. Всё остальное время каждый процессор работает только со своими &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точками. Это обеспечивает применимость алгоритма для больших &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
При распараллеливании по точкам исходных данных и условии останову по малому изменению степеней принадлежности выполнение одной итерации алгоритма FCM может быть разделено на следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм знаменателя (по &amp;lt;math&amp;gt;\frac{M}{p}-1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; операций возведения в степень на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм числителя (по &amp;lt;math&amp;gt;\frac{M}{p} -1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; умножений на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; редукций сумм и передач значений &amp;lt;math&amp;gt;V_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;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; умножений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов вычисления степеней принадлежности точек (по &amp;lt;math&amp;gt;c+1&amp;lt;/math&amp;gt; делений, c возведений в степень, &amp;lt;math&amp;gt;c-1&amp;lt;/math&amp;gt; сложений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* до &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов проверки условий останова (по &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; вычитанию, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; сравнению), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; редукция для обмена статусом завершения.&lt;br /&gt;
Таким образом, при распараллеливании по точкам исходных данных при условии наличия в каждом узле достаточного объёма памяти для хранения всего массива координат центров кластеров высота и ширина ЯПФ алгоритма FCM равны соответственно &amp;lt;math&amp;gt;O(c^2 I+cnI)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: массив векторов &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt;, число кластеров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt; для входных векторов, 3 вспомогательных параметра.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;). Условие нормировки: &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
В случае неограниченного распараллеливания по точкам данных (1 процесс на точку), отношение последовательной сложности алгоритма к параллельной пропорционально &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; задаёт степень «размытости» кластеров. В отсутствие априорных данных его обычно берут равным 2. В предельном случае сведения параметра &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; к значению 1, кластеры становятся чёткими и алгоритм вырождается в алгоритм кластеризации K-Means.&lt;br /&gt;
&lt;br /&gt;
Алгоритм недетерминирован, начальное положение кластеров задаётся случайно либо явно, либо опосредованно (через матрицу принадлежности). Алгоритм сходится к локальному экстремуму &amp;lt;ref&amp;gt;Höppner, F., Klawonn, F.: [https://public.fh wolfenbuettel.de/~klawonn/Papers/hoeppnerklawonntfs03.pdf A Contribution to Convergence Theory of Fuzzy c-Means and Derivatives], Дата последнего обращения: 13.10.2016&amp;lt;/ref&amp;gt; и, таким образом, не гарантирует оптимальный результат при случайном выборе начальных значений.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
* пакет MATLAB &amp;lt;ref&amp;gt;[http://www.mathworks.com/help/fuzzy/fcm.html Документация пакета MATLAB, функция fcm], последнее обращение 15.10.2016&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Реализация алгоритма на POSTGRESQL &amp;lt;ref&amp;gt;[http://num-meth.srcc.msu.ru/zhurnal/tom_2012/pdf/v13r207.pdf Реализация алгоритма Fuzzy C-means на POSTGRESQL], последнее обращение 15.10.2016&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en:Parallel Fuzzy c-Means Clustering]]&lt;/div&gt;</summary>
		<author><name>Illusive mike</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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=13686</id>
		<title>Участник:Nikmedoed/Нечеткий алгоритм С-средних (Fuzzy 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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=13686"/>
		<updated>2016-10-25T12:44:40Z</updated>

		<summary type="html">&lt;p&gt;Illusive mike: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нечеткий алгоритм С-средних (Fuzzy C-means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(c^2 MI + cMnI), (I&amp;lt;/math&amp;gt; - число итераций, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - число точек, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - размерность точек (свойств на объект)&amp;lt;math&amp;gt;)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(c^2 I + cnI)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O( M )&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Выполняют: [[Участник:Nikmedoed|Н.А. Муромцев]], [[Участник:illusive_mike|М.С. Дворецкий]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Нечеткий алгоритм С-средних&#039;&#039;&#039; (&#039;&#039;Fuzzy C-means&#039;&#039;) - позволяет получить нечёткую кластеризацию больших наборов числовых данных, что позволяет корректно определять объекты на границах кластеров. Однако, выполнение данного алгоритма требует серьёзных вычислительных ресурсов, а также изначального задания количества кластеров. Кроме того, может возникнуть неоднозначность с объектами, удалёнными от центров всех кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм кластеризации Fuzzy C-Means (FCM) был предложен Дж. Данном в 1973 году &amp;lt;ref&amp;gt;Dunn, J.C.: A Fuzzy Relative of the ISODATA Process and Its Use in Detecting Compact Well-Separated Clusters. Journal of Cybernetics. 3 (1973): 32–57&amp;lt;/ref&amp;gt; и доработан Дж. Бездеком в 1981 году &amp;lt;ref&amp;gt;Bezdek, J.C.: Pattern Recognition with Fuzzy Objective Function Algorithms. Plenum Press, New York (1981). ISBN 0-306-40671-3&amp;lt;/ref&amp;gt;. В отличие от большинства существующих алгоритмов кластеризации, данный алгоритм является нечётким – каждый из объектов не входит однозначно в какой-либо кластер, а принадлежит всем кластерам с различными степенями принадлежности. Это даёт преимущества в качестве разбиения в случаях, когда кластеры находятся близко друг к другу, и большое число точек находится на их границах. Однако ценой такой нечёткости служат большие вычислительные затраты, чем у таких чётких алгоритмов, как [[Hard C-Means]] и [[K-Means]], при сохранении таких их недостатков, как априорное определение числа кластеров и отсутствие гарантии глобальной оптимальности результата.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Исходные данные: массив объектов &amp;lt;math&amp;gt;{X_k}\in{\R^n}, k=\overline{1,M}&amp;lt;/math&amp;gt;, число кластеров c, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица разбиения &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;M\times c&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;), центры кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, расстояния &amp;lt;math&amp;gt;D_{ki}&amp;lt;/math&amp;gt; между объектами и центрами кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода (вычисляются последовательно на каждой итерации):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Уточнение центров кластеров по степеням принадлежности&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;V_i=\frac{\sum^{M}_{k=1} {\mu^m_{ki} * X_k}}{\sum^{M}_{k=1} {\mu^m_{ki}}},i=\overline{1,c}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
2. Расчёт расстояний между новыми центрами кластеров и точками данных&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
3. Пересчёт степеней принадлежности объектов кластерам&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} \left ( {\frac{D_{ki}}{D_{kj}}} \right ) }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На каждой итерации алгоритма происходит уточнение элементов матрицы &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Выходом алгоритма служит матрица &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;, к которой алгоритм сходится. Факт того, что алгоритм сошёлся, устанавливается проверкой вида &amp;lt;math&amp;gt;\max_{k = \overline{1,M},i = \overline{1,c}} {( \left | \mu_{ki} - \mu_{ki}^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;  либо  &amp;lt;math&amp;gt;\max_{i = \overline{1,c}} {( \left | V_i - V_i^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mu_{ki}^* (V_i^*)&amp;lt;/math&amp;gt; – значение &amp;lt;math&amp;gt;\mu_{ki}(V_i)&amp;lt;/math&amp;gt;, вычисленное на предыдущей итерации.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Вычислительное ядро алгоритма Fuzzy C-Means составляют шаги вычисления центров кластеров, расстояний между ними и точками данных и в особенности пересчёта матрицы степеней принадлежности точек данных.&lt;br /&gt;
&lt;br /&gt;
При реальном вычислении некоторые повторяющиеся вычисления могут быть устранены. Так, для шага вычисления центров кластеров величины &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; могут вычисляться однократно и умножаться на &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt; при включении в сумму, записанную в числителе. Для шага вычисления расстояний между центрами кластеров и точками, операция взятия квадратного корня не является обязательной, так как в дальнейшем на шаге вычисления степеней принадлежности можно непосредственно использовать квадраты этих расстояний, и сумма в знаменателе будет приобретать вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum^{c}_{j=1} {\left ( \frac{D_{ki} ^ {2}}{D_{kj} ^ {2}} \right )}^{{1}/{m-1}}&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;
Инициализация происходит случайным заполнением матрицы принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; с соблюдением условия нормировки &amp;lt;math&amp;gt;\sum_{i=1}^c {\mu_{ki} =1}&amp;lt;/math&amp;gt; и переходом к шагу 1, либо случайным определением центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt; и переходом к шагу 2.&lt;br /&gt;
&lt;br /&gt;
Далее осуществляются итерации следующего вида:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;V_i=\frac{\sum_{k=1}^{M} {\mu_{ki}^m * X_k}}{\sum_{k=1}^{M} {\mu_{ki}^m} },i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} {\left ( \frac{D_{ki}}{D_{kj}} \right )} }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конце каждой итерации проверяется условие останова вида &amp;lt;math&amp;gt;\max_{k = \overline{1,M},i = \overline{1,c}} {( \left | \mu_{ki} - \mu_{ki}^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, либо &amp;lt;math&amp;gt;\max_{i = \overline{1,c}} {( \left | V_i - V_i^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mu_{ki}^* (V_i^*)&amp;lt;/math&amp;gt; – значение &amp;lt;math&amp;gt;\mu_{ki}(V_i)&amp;lt;/math&amp;gt;, вычисленное на предыдущей итерации. Если условие не выполнено, осуществляется переход к шагу 1.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
При кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; объектов данных, представленных точками в &amp;lt;math&amp;gt;\R^n&amp;lt;/math&amp;gt;, на &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; кластеров, алгоритм Fuzzy C-Means в последовательном варианте имеет вычислительную сложность – &amp;lt;math&amp;gt;O(c^2 MI+cMnI)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; – число итераций. Если считать размерность данных &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; малой, то эта сложность сводится к &amp;lt;math&amp;gt;O(c^2 MI)&amp;lt;/math&amp;gt;. Основной частью алгоритма в этом случае является пересчёт матрицы принадлежностей, требующий вычисления &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt; сумм из &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; слагаемых на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Приведём граф единичной итерации алгоритма в параллельном оптимизированном варианте:&lt;br /&gt;
&lt;br /&gt;
[[File:C-means_paralle_graph.png|thumb|upright=2.5|frame|center|alt=Paralel Fuzzy C-Means|Каждая вершина данного графа соответствует операциям из алгоритма, указанным при помощи указанных формул. Каждый из p столбцов соответствует работе одного из процессов. Пометки справа указывают число повторений каждого узла в ходе одной итерации.]]&lt;br /&gt;
&lt;br /&gt;
Раздел 1.8 уточняет, соответствуют ли эти повторения однотипным ярусам или точкам данных, вычисления для которых можно распараллелить и далее.&lt;br /&gt;
&lt;br /&gt;
Каждый процесс обладает следующими данными:&lt;br /&gt;
* координатами точек данных &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p}+1)}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;rnk&amp;lt;/math&amp;gt; – номер процесса,&lt;br /&gt;
* значениями &amp;lt;math&amp;gt;\mu_{ki}&amp;lt;/math&amp;gt; степени принадлежности для своих точек (&amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p} +1)}, i=\overline{1,c}&amp;lt;/math&amp;gt;),&lt;br /&gt;
* координатами центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=\overline{1,c}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Суммы &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m X_k}&amp;lt;/math&amp;gt; вычисляются одновременно, поэтому значения &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; вычисляются по одному разу за итерацию. Таким образом, второй ярус операций на рисунке на деле не содержит операций возведения в степень.&lt;br /&gt;
За счёт линейности большинства выражений относительно данных по точкам, процессы взаимодействуют только при редукции сумм, составляющих &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;. Всё остальное время каждый процессор работает только со своими &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точками. Это обеспечивает применимость алгоритма для больших &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
При распараллеливании по точкам исходных данных и условии останову по малому изменению степеней принадлежности выполнение одной итерации алгоритма FCM может быть разделено на следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм знаменателя (по &amp;lt;math&amp;gt;\frac{M}{p}-1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; операций возведения в степень на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм числителя (по &amp;lt;math&amp;gt;\frac{M}{p} -1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; умножений на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; редукций сумм и передач значений &amp;lt;math&amp;gt;V_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;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; умножений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов вычисления степеней принадлежности точек (по &amp;lt;math&amp;gt;c+1&amp;lt;/math&amp;gt; делений, c возведений в степень, &amp;lt;math&amp;gt;c-1&amp;lt;/math&amp;gt; сложений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* до &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов проверки условий останова (по &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; вычитанию, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; сравнению), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; редукция для обмена статусом завершения.&lt;br /&gt;
Таким образом, при распараллеливании по точкам исходных данных при условии наличия в каждом узле достаточного объёма памяти для хранения всего массива координат центров кластеров высота и ширина ЯПФ алгоритма FCM равны соответственно &amp;lt;math&amp;gt;O(c^2 I+cnI)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: массив векторов &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt;, число кластеров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt; для входных векторов, 3 вспомогательных параметра.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;). Условие нормировки: &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
В случае неограниченного распараллеливания по точкам данных (1 процесс на точку), отношение последовательной сложности алгоритма к параллельной пропорционально &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; задаёт степень «размытости» кластеров. В отсутствие априорных данных его обычно берут равным 2. В предельном случае сведения параметра &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; к значению 1, кластеры становятся чёткими и алгоритм вырождается в алгоритм кластеризации K-Means.&lt;br /&gt;
&lt;br /&gt;
Алгоритм недетерминирован, начальное положение кластеров задаётся случайно либо явно, либо опосредованно (через матрицу принадлежности). Алгоритм сходится к локальному экстремуму &amp;lt;ref&amp;gt;Höppner, F., Klawonn, F.: [https://public.fh wolfenbuettel.de/~klawonn/Papers/hoeppnerklawonntfs03.pdf A Contribution to Convergence Theory of Fuzzy c-Means and Derivatives], Дата последнего обращения: 13.10.2016&amp;lt;/ref&amp;gt; и, таким образом, не гарантирует оптимальный результат при случайном выборе начальных значений.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
* пакет MATLAB &amp;lt;ref&amp;gt;[http://www.mathworks.com/help/fuzzy/fcm.html Документация пакета MATLAB, функция fcm], последнее обращение 15.10.2016&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Реализация алгоритма на POSTGRESQL &amp;lt;ref&amp;gt;[http://num-meth.srcc.msu.ru/zhurnal/tom_2012/pdf/v13r207.pdf Реализация алгоритма Fuzzy C-means на POSTGRESQL], последнее обращение 15.10.2016&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en:Parallel Fuzzy c-Means Clustering]]&lt;/div&gt;</summary>
		<author><name>Illusive mike</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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=13312</id>
		<title>Участник:Nikmedoed/Нечеткий алгоритм С-средних (Fuzzy 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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=13312"/>
		<updated>2016-10-21T09:04:05Z</updated>

		<summary type="html">&lt;p&gt;Illusive mike: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нечеткий алгоритм С-средних (Fuzzy C-means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(c^2 MI + cMnI), (I&amp;lt;/math&amp;gt; - число итераций, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - число точек, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - размерность точек (свойств на объект)&amp;lt;math&amp;gt;)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(c^2 I + cnI)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O( M )&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Выполняют: [[Участник:Nikmedoed|Н.А. Муромцев]], [[Участник:illusive_mike|М.С. Дворецкий]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Нечеткий алгоритм С-средних&#039;&#039;&#039; (&#039;&#039;Fuzzy C-means&#039;&#039;) - позволяет получить нечёткую кластеризацию больших наборов числовых данных, что позволяет корректно определять объекты на границах кластеров. Однако, выполнение данного алгоритма требует серьёзных вычислительных ресурсов, а также изначального задания количества кластеров. Кроме того, может возникнуть неоднозначность с объектами, удалёнными от центров всех кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм кластеризации Fuzzy C-Means (FCM) был предложен Дж. Данном в 1973 году &amp;lt;ref&amp;gt;Dunn, J.C.: A Fuzzy Relative of the ISODATA Process and Its Use in Detecting Compact Well-Separated Clusters. Journal of Cybernetics. 3 (1973): 32–57&amp;lt;/ref&amp;gt; и доработан Дж. Бездеком в 1981 году &amp;lt;ref&amp;gt;Bezdek, J.C.: Pattern Recognition with Fuzzy Objective Function Algorithms. Plenum Press, New York (1981). ISBN 0-306-40671-3&amp;lt;/ref&amp;gt;. В отличие от большинства существующих алгоритмов кластеризации, данный алгоритм является нечётким – каждый из объектов не входит однозначно в какой-либо кластер, а принадлежит всем кластерам с различными степенями принадлежности. Это даёт преимущества в качестве разбиения в случаях, когда кластеры находятся близко друг к другу, и большое число точек находится на их границах. Однако ценой такой нечёткости служат большие вычислительные затраты, чем у таких чётких алгоритмов, как [[Hard C-Means]] и [[K-Means]], при сохранении таких их недостатков, как априорное определение числа кластеров и отсутствие гарантии глобальной оптимальности результата.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Исходные данные: массив объектов &amp;lt;math&amp;gt;{X_k}\in{\R^n}, k=\overline{1,M}&amp;lt;/math&amp;gt;, число кластеров c, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные: матрица разбиения &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;M\times c&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;), центры кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, расстояния &amp;lt;math&amp;gt;D_{ki}&amp;lt;/math&amp;gt; между объектами и центрами кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;V_i=\frac{\sum^{M}_{k=1} {\mu^m_{ki} * X_k}}{\sum^{M}_{k=1} {\mu^m_{ki}}},i=\overline{1,c}\\&lt;br /&gt;
&amp;amp;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}\\&lt;br /&gt;
&amp;amp;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} \left ( {\frac{D_{ki}}{D_{kj}}} \right ) }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Вычислительное ядро алгоритма Fuzzy C-Means составляют шаги вычисления центров кластеров, расстояний между ними и точками данных и в особенности пересчёта матрицы степеней принадлежности точек данных.&lt;br /&gt;
&lt;br /&gt;
При реальном вычислении некоторые повторяющиеся вычисления могут быть устранены. Так, для шага вычисления центров кластеров величины &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; могут вычисляться однократно и умножаться на &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt; при включении в сумму, записанную в числителе. Для шага вычисления расстояний между центрами кластеров и точками, операция взятия квадратного корня не является обязательной, так как в дальнейшем на шаге вычисления степеней принадлежности можно непосредственно использовать квадраты этих расстояний, и сумма в знаменателе будет приобретать вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum^{c}_{j=1} {\left ( \frac{D_{ki} ^ {2}}{D_{kj} ^ {2}} \right )}^{{1}/{m-1}}&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;
Инициализация происходит случайным заполнением матрицы принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; с соблюдением условия нормировки &amp;lt;math&amp;gt;\sum_{i=1}^c {\mu_{ki} =1}&amp;lt;/math&amp;gt; и переходом к шагу 1, либо случайным определением центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt; и переходом к шагу 2.&lt;br /&gt;
&lt;br /&gt;
Далее осуществляются итерации следующего вида:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;V_i=\frac{\sum_{k=1}^{M} {\mu_{ki}^m * X_k}}{\sum_{k=1}^{M} {\mu_{ki}^m} },i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} {\left ( \frac{D_{ki}}{D_{kj}} \right )} }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конце каждой итерации проверяется условие останова вида &amp;lt;math&amp;gt;\max_{k = \overline{1,M},i = \overline{1,c}} {( \left | \mu_{ki} - \mu_{ki}^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, либо &amp;lt;math&amp;gt;\max_{i = \overline{1,c}} {( \left | V_i - V_i^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mu_{ki}^* (V_i^*)&amp;lt;/math&amp;gt; – значение &amp;lt;math&amp;gt;\mu_{ki}(V_i)&amp;lt;/math&amp;gt;, вычисленное на предыдущей итерации. Если условие не выполнено, осуществляется переход к шагу 1.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
При кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; объектов данных, представленных точками в &amp;lt;math&amp;gt;\R^n&amp;lt;/math&amp;gt;, на &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; кластеров, алгоритм Fuzzy C-Means в последовательном варианте имеет вычислительную сложность – &amp;lt;math&amp;gt;O(c^2 MI+cMnI)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; – число итераций. Если считать размерность данных &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; малой, то эта сложность сводится к &amp;lt;math&amp;gt;O(c^2 MI)&amp;lt;/math&amp;gt;. Основной частью алгоритма в этом случае является пересчёт матрицы принадлежностей, требующий вычисления &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt; сумм из &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; слагаемых на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Приведём граф единичной итерации алгоритма в параллельном оптимизированном варианте:&lt;br /&gt;
&lt;br /&gt;
[[File:C-means_paralle_graph.png|thumb|upright=2.5|frame|center|alt=Paralel Fuzzy C-Means|Каждая вершина данного графа соответствует операциям из алгоритма, указанным при помощи указанных формул. Каждый из p столбцов соответствует работе одного из процессов. Пометки справа указывают число повторений каждого узла в ходе одной итерации.]]&lt;br /&gt;
&lt;br /&gt;
Раздел 1.8 уточняет, соответствуют ли эти повторения однотипным ярусам или точкам данных, вычисления для которых можно распараллелить и далее.&lt;br /&gt;
&lt;br /&gt;
Каждый процесс обладает следующими данными:&lt;br /&gt;
* координатами точек данных &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p}+1)}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;rnk&amp;lt;/math&amp;gt; – номер процесса,&lt;br /&gt;
* значениями &amp;lt;math&amp;gt;\mu_{ki}&amp;lt;/math&amp;gt; степени принадлежности для своих точек (&amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p} +1)}, i=\overline{1,c}&amp;lt;/math&amp;gt;),&lt;br /&gt;
* координатами центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=\overline{1,c}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Суммы &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m X_k}&amp;lt;/math&amp;gt; вычисляются одновременно, поэтому значения &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; вычисляются по одному разу за итерацию. Таким образом, второй ярус операций на рисунке на деле не содержит операций возведения в степень.&lt;br /&gt;
За счёт линейности большинства выражений относительно данных по точкам, процессы взаимодействуют только при редукции сумм, составляющих &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;. Всё остальное время каждый процессор работает только со своими &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точками. Это обеспечивает применимость алгоритма для больших &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
При распараллеливании по точкам исходных данных и условии останову по малому изменению степеней принадлежности выполнение одной итерации алгоритма FCM может быть разделено на следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм знаменателя (по &amp;lt;math&amp;gt;\frac{M}{p}-1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; операций возведения в степень на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм числителя (по &amp;lt;math&amp;gt;\frac{M}{p} -1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; умножений на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; редукций сумм и передач значений &amp;lt;math&amp;gt;V_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;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; умножений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов вычисления степеней принадлежности точек (по &amp;lt;math&amp;gt;c+1&amp;lt;/math&amp;gt; делений, c возведений в степень, &amp;lt;math&amp;gt;c-1&amp;lt;/math&amp;gt; сложений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* до &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов проверки условий останова (по &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; вычитанию, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; сравнению), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; редукция для обмена статусом завершения.&lt;br /&gt;
Таким образом, при распараллеливании по точкам исходных данных при условии наличия в каждом узле достаточного объёма памяти для хранения всего массива координат центров кластеров высота и ширина ЯПФ алгоритма FCM равны соответственно &amp;lt;math&amp;gt;O(c^2 I+cnI)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: массив векторов &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt;, число кластеров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt; для входных векторов, 3 вспомогательных параметра.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;). Условие нормировки: &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
В случае неограниченного распараллеливания по точкам данных (1 процесс на точку), отношение последовательной сложности алгоритма к параллельной пропорционально &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; задаёт степень «размытости» кластеров. В отсутствие априорных данных его обычно берут равным 2. В предельном случае сведения параметра &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; к значению 1, кластеры становятся чёткими и алгоритм вырождается в алгоритм кластеризации K-Means.&lt;br /&gt;
&lt;br /&gt;
Алгоритм недетерминирован, начальное положение кластеров задаётся случайно либо явно, либо опосредованно (через матрицу принадлежности). Алгоритм сходится к локальному экстремуму &amp;lt;ref&amp;gt;Höppner, F., Klawonn, F.: [https://public.fh wolfenbuettel.de/~klawonn/Papers/hoeppnerklawonntfs03.pdf A Contribution to Convergence Theory of Fuzzy c-Means and Derivatives], Дата последнего обращения: 13.10.2016&amp;lt;/ref&amp;gt; и, таким образом, не гарантирует оптимальный результат при случайном выборе начальных значений.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
* пакет MATLAB &amp;lt;ref&amp;gt;[http://www.mathworks.com/help/fuzzy/fcm.html Документация пакета MATLAB, функция fcm], последнее обращение 15.10.2016&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Реализация алгоритма на POSTGRESQL &amp;lt;ref&amp;gt;[http://num-meth.srcc.msu.ru/zhurnal/tom_2012/pdf/v13r207.pdf Реализация алгоритма Fuzzy C-means на POSTGRESQL], последнее обращение 15.10.2016&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en:Parallel Fuzzy c-Means Clustering]]&lt;/div&gt;</summary>
		<author><name>Illusive mike</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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=10086</id>
		<title>Участник:Nikmedoed/Нечеткий алгоритм С-средних (Fuzzy 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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=10086"/>
		<updated>2016-10-15T14:58:39Z</updated>

		<summary type="html">&lt;p&gt;Illusive mike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Нечеткий алгоритм С-средних (Fuzzy C-means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(c^2 MI + cMnI), (I&amp;lt;/math&amp;gt; - число итераций, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - число точек, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - размерность точек (свойств на объект)&amp;lt;math&amp;gt;)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(c^2 I + cnI)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O( M )&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Выполняют: [[Участник:Nikmedoed|Н.А. Муромцев]], [[Участник:illusive_mike|М.С. Дворецкий]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Нечеткий алгоритм С-средних&#039;&#039;&#039; (&#039;&#039;Fuzzy C-means&#039;&#039;) - позволяет получить нечёткую кластеризацию больших наборов числовых данных, что позволяет корректно определять объекты на границах кластеров. Однако, выполнение данного алгоритма требует серьёзных вычислительных ресурсов, а также изначального задания количества кластеров. Кроме того, может возникнуть неоднозначность с объектами, удалёнными от центров всех кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм кластеризации Fuzzy C-Means (FCM) был предложен Дж. Данном в 1973 году &amp;lt;ref&amp;gt;Dunn, J.C.: A Fuzzy Relative of the ISODATA Process and Its Use in Detecting Compact Well-Separated Clusters. Journal of Cybernetics. 3 (1973): 32–57&amp;lt;/ref&amp;gt; и доработан Дж. Бездеком в 1981 году &amp;lt;ref&amp;gt;Bezdek, J.C.: Pattern Recognition with Fuzzy Objective Function Algorithms. Plenum Press, New York (1981). ISBN 0-306-40671-3&amp;lt;/ref&amp;gt;. В отличие от большинства существующих алгоритмов кластеризации, данный алгоритм является нечётким – каждый из объектов не входит однозначно в какой-либо кластер, а принадлежит всем кластерам с различными степенями принадлежности. Это даёт преимущества в качестве разбиения в случаях, когда кластеры находятся близко друг к другу, и большое число точек находится на их границах. Однако ценой такой нечёткости служат большие вычислительные затраты, чем у таких чётких алгоритмов, как [[Hard C-Means]] и [[K-Means]], при сохранении таких их недостатков, как априорное определение числа кластеров и отсутствие гарантии глобальной оптимальности результата.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Исходные данные: массив объектов &amp;lt;math&amp;gt;{X_k}\in{\R^n}, k=\overline{1,M}&amp;lt;/math&amp;gt;, число кластеров c, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные: матрица разбиения &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;M\times c&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;), центры кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, расстояния &amp;lt;math&amp;gt;D_{ki}&amp;lt;/math&amp;gt; между объектами и центрами кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;V_i=\frac{\sum^{M}_{k=1} {\mu^m_{ki} * X_k}}{\sum^{M}_{k=1} {\mu^m_{ki}}},i=\overline{1,c}\\&lt;br /&gt;
&amp;amp;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}\\&lt;br /&gt;
&amp;amp;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} \left ( {\frac{D_{ki}}{D_{kj}}} \right ) }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Вычислительное ядро алгоритма Fuzzy C-Means составляют шаги вычисления центров кластеров, расстояний между ними и точками данных и в особенности пересчёта матрицы степеней принадлежности точек данных.&lt;br /&gt;
&lt;br /&gt;
При реальном вычислении некоторые повторяющиеся вычисления могут быть устранены. Так, для шага вычисления центров кластеров величины &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; могут вычисляться однократно и умножаться на &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt; при включении в сумму, записанную в числителе. Для шага вычисления расстояний между центрами кластеров и точками, операция взятия квадратного корня не является обязательной, так как в дальнейшем на шаге вычисления степеней принадлежности можно непосредственно использовать квадраты этих расстояний, и сумма в знаменателе будет приобретать вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum^{c}_{j=1} {\left ( \frac{D_{ki} ^ {2}}{D_{kj} ^ {2}} \right )}^{{1}/{m-1}}&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;
Инициализация происходит случайным заполнением матрицы принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; с соблюдением условия нормировки &amp;lt;math&amp;gt;\sum_{i=1}^c {\mu_{ki} =1}&amp;lt;/math&amp;gt; и переходом к шагу 1, либо случайным определением центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt; и переходом к шагу 2.&lt;br /&gt;
&lt;br /&gt;
Далее осуществляются итерации следующего вида:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;V_i=\frac{\sum_{k=1}^{M} {\mu_{ki}^m * X_k}}{\sum_{k=1}^{M} {\mu_{ki}^m} },i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} {\left ( \frac{D_{ki}}{D_{kj}} \right )} }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конце каждой итерации проверяется условие останова вида &amp;lt;math&amp;gt;\max_{k = \overline{1,M},i = \overline{1,c}} {( \left | \mu_{ki} - \mu_{ki}^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, либо &amp;lt;math&amp;gt;\max_{i = \overline{1,c}} {( \left | V_i - V_i^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mu_{ki}^* (V_i^*)&amp;lt;/math&amp;gt; – значение &amp;lt;math&amp;gt;\mu_{ki}(V_i)&amp;lt;/math&amp;gt;, вычисленное на предыдущей итерации. Если условие не выполнено, осуществляется переход к шагу 1.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
При кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; объектов данных, представленных точками в &amp;lt;math&amp;gt;\R^n&amp;lt;/math&amp;gt;, на &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; кластеров, алгоритм Fuzzy C-Means в последовательном варианте имеет вычислительную сложность – &amp;lt;math&amp;gt;O(c^2 MI+cMnI)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; – число итераций. Если считать размерность данных &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; малой, то эта сложность сводится к &amp;lt;math&amp;gt;O(c^2 MI)&amp;lt;/math&amp;gt;. Основной частью алгоритма в этом случае является пересчёт матрицы принадлежностей, требующий вычисления &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt; сумм из &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; слагаемых на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Приведём граф единичной итерации алгоритма в параллельном оптимизированном варианте:&lt;br /&gt;
&lt;br /&gt;
[[File:C-means_paralle_graph.png|thumb|upright=2.5|frame|center|alt=Paralel Fuzzy C-Means|Каждая вершина данного графа соответствует операциям из алгоритма, указанным при помощи указанных формул. Каждый из p столбцов соответствует работе одного из процессов. Пометки справа указывают число повторений каждого узла в ходе одной итерации.]]&lt;br /&gt;
&lt;br /&gt;
Раздел 1.8 уточняет, соответствуют ли эти повторения однотипным ярусам или точкам данных, вычисления для которых можно распараллелить и далее.&lt;br /&gt;
&lt;br /&gt;
Каждый процесс обладает следующими данными:&lt;br /&gt;
* координатами точек данных &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p}+1)}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;rnk&amp;lt;/math&amp;gt; – номер процесса,&lt;br /&gt;
* значениями &amp;lt;math&amp;gt;\mu_{ki}&amp;lt;/math&amp;gt; степени принадлежности для своих точек (&amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p} +1)}, i=\overline{1,c}&amp;lt;/math&amp;gt;),&lt;br /&gt;
* координатами центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=\overline{1,c}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Суммы &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m X_k}&amp;lt;/math&amp;gt; вычисляются одновременно, поэтому значения &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; вычисляются по одному разу за итерацию. Таким образом, второй ярус операций на рисунке на деле не содержит операций возведения в степень.&lt;br /&gt;
За счёт линейности большинства выражений относительно данных по точкам, процессы взаимодействуют только при редукции сумм, составляющих &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;. Всё остальное время каждый процессор работает только со своими &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точками. Это обеспечивает применимость алгоритма для больших &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
При распараллеливании по точкам исходных данных выполнение одной итерации алгоритма FCM может быть разделено на следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм знаменателя (по &amp;lt;math&amp;gt;\frac{M}{p}-1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; операций возведения в степень на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм числителя (по &amp;lt;math&amp;gt;\frac{M}{p} -1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; умножений на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; редукций сумм и передач значений &amp;lt;math&amp;gt;V_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;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; умножений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов вычисления степеней принадлежности точек (по &amp;lt;math&amp;gt;c+1&amp;lt;/math&amp;gt; делений, c возведений в степень, &amp;lt;math&amp;gt;c-1&amp;lt;/math&amp;gt; сложений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку.&lt;br /&gt;
Таким образом, при распараллеливании по точкам исходных данных при условии наличия в каждом узле достаточного объёма памяти для хранения всего массива координат центров кластеров высота и ширина ЯПФ алгоритма FCM равны соответственно &amp;lt;math&amp;gt;O(c^2 I+cnI)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: массив векторов &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt;, число кластеров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt; для входных векторов, 3 вспомогательных параметра.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;). Условие нормировки: &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
В случае неограниченного распараллеливания по точкам данных (1 процесс на точку), отношение последовательной сложности алгоритма к параллельной пропорционально &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; задаёт степень «размытости» кластеров. В отсутствие априорных данных его обычно берут равным 2. В предельном случае сведения параметра &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; к значению 1, кластеры становятся чёткими и алгоритм вырождается в алгоритм кластеризации K-Means.&lt;br /&gt;
&lt;br /&gt;
Алгоритм недетерминирован, начальное положение кластеров задаётся случайно либо явно, либо опосредованно (через матрицу принадлежности). Алгоритм сходится к локальному экстремуму &amp;lt;ref&amp;gt;Höppner, F., Klawonn, F.: [https://public.fh wolfenbuettel.de/~klawonn/Papers/hoeppnerklawonntfs03.pdf A Contribution to Convergence Theory of Fuzzy c-Means and Derivatives], Дата последнего обращения: 13.10.2016&amp;lt;/ref&amp;gt; и, таким образом, не гарантирует оптимальный результат при случайном выборе начальных значений.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
* пакет MATLAB &amp;lt;ref&amp;gt;[http://www.mathworks.com/help/fuzzy/fcm.html Документация пакета MATLAB, функция fcm], последнее обращение 15.10.2016&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Реализация алгоритма на POSTGRESQL &amp;lt;ref&amp;gt;[http://num-meth.srcc.msu.ru/zhurnal/tom_2012/pdf/v13r207.pdf Реализация алгоритма Fuzzy C-means на POSTGRESQL], последнее обращение 15.10.2016&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en:Parallel Fuzzy c-Means Clustering]]&lt;/div&gt;</summary>
		<author><name>Illusive mike</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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=10074</id>
		<title>Участник:Nikmedoed/Нечеткий алгоритм С-средних (Fuzzy 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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=10074"/>
		<updated>2016-10-15T14:56:13Z</updated>

		<summary type="html">&lt;p&gt;Illusive mike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Нечеткий алгоритм С-средних (Fuzzy C-means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(c^2 MI + cMnI), (I&amp;lt;/math&amp;gt; - число итераций, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - число точек, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - размерность точек (свойств на объект)&amp;lt;math&amp;gt;)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(c^2 I + cnI)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O( M )&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Выполняют: [[Участник:Nikmedoed|Н.А. Муромцев]], [[Участник:illusive_mike|М.С. Дворецкий]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Нечеткий алгоритм С-средних&#039;&#039;&#039; (&#039;&#039;Fuzzy C-means&#039;&#039;) - позволяет получить нечёткую кластеризация больших наборов числовых данных, что позволяет определять объекты на границе кластеров в отдельные кластеры. Однако, выполнение данного алгоритма требует серьёзных вычислительных ресурсов, а также изначального задания количества кластеров. Кроме того, может возникнуть неоднозначность с объектами удалёнными от центров всех кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм кластеризации Fuzzy C-Means (FCM) был предложен Дж. Данном в 1973 году &amp;lt;ref&amp;gt;Dunn, J.C.: A Fuzzy Relative of the ISODATA Process and Its Use in Detecting Compact Well-Separated Clusters. Journal of Cybernetics. 3 (1973): 32–57&amp;lt;/ref&amp;gt; и доработан Дж. Бездеком в 1981 году &amp;lt;ref&amp;gt;Bezdek, J.C.: Pattern Recognition with Fuzzy Objective Function Algorithms. Plenum Press, New York (1981). ISBN 0-306-40671-3&amp;lt;/ref&amp;gt;. В отличие от большинства существующих алгоритмов кластеризации, данный алгоритм является нечётким – каждый из объектов не входит однозначно в какой-либо кластер, а принадлежит всем кластерам с различными степенями принадлежности. Это даёт преимущества в качестве разбиения в случаях, когда кластеры находятся близко друг к другу, и большое число точек находится на их границах. Однако ценой такой нечёткости служат большие вычислительные затраты, чем у таких чётких алгоритмов, как [[Hard C-Means]] и [[K-Means]], при сохранении таких их недостатков, как априорное определение числа кластеров и отсутствие гарантии глобальной оптимальности результата.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Исходные данные: массив объектов &amp;lt;math&amp;gt;{X_k}\in{\R^n}, k=\overline{1,M}&amp;lt;/math&amp;gt;, число кластеров c, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные: матрица разбиения &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;M\times c&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;), центры кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, расстояния &amp;lt;math&amp;gt;D_{ki}&amp;lt;/math&amp;gt; между объектами и центрами кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;V_i=\frac{\sum^{M}_{k=1} {\mu^m_{ki} * X_k}}{\sum^{M}_{k=1} {\mu^m_{ki}}},i=\overline{1,c}\\&lt;br /&gt;
&amp;amp;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}\\&lt;br /&gt;
&amp;amp;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} \left ( {\frac{D_{ki}}{D_{kj}}} \right ) }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Вычислительное ядро алгоритма Fuzzy C-Means составляют шаги вычисления центров кластеров, расстояний между ними и точками данных и в особенности пересчёта матрицы степеней принадлежности точек данных.&lt;br /&gt;
&lt;br /&gt;
При реальном вычислении некоторые повторяющиеся вычисления могут быть устранены. Так, для шага вычисления центров кластеров величины &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; могут вычисляться однократно и умножаться на &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt; при включении в сумму, записанную в числителе. Для шага вычисления расстояний между центрами кластеров и точками, операция взятия квадратного корня не является обязательной, так как в дальнейшем на шаге вычисления степеней принадлежности можно непосредственно использовать квадраты этих расстояний, и сумма в знаменателе будет приобретать вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum^{c}_{j=1} {\left ( \frac{D_{ki} ^ {2}}{D_{kj} ^ {2}} \right )}^{{1}/{m-1}}&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;
Инициализация происходит случайным заполнением матрицы принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; с соблюдением условия нормировки &amp;lt;math&amp;gt;\sum_{i=1}^c {\mu_{ki} =1}&amp;lt;/math&amp;gt; и переходом к шагу 1, либо случайным определением центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt; и переходом к шагу 2.&lt;br /&gt;
&lt;br /&gt;
Далее осуществляются итерации следующего вида:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;V_i=\frac{\sum_{k=1}^{M} {\mu_{ki}^m * X_k}}{\sum_{k=1}^{M} {\mu_{ki}^m} },i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} {\left ( \frac{D_{ki}}{D_{kj}} \right )} }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конце каждой итерации проверяется условие останова вида &amp;lt;math&amp;gt;\max_{k = \overline{1,M},i = \overline{1,c}} {( \left | \mu_{ki} - \mu_{ki}^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, либо &amp;lt;math&amp;gt;\max_{i = \overline{1,c}} {( \left | V_i - V_i^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mu_{ki}^* (V_i^*)&amp;lt;/math&amp;gt; – значение &amp;lt;math&amp;gt;\mu_{ki}(V_i)&amp;lt;/math&amp;gt;, вычисленное на предыдущей итерации. Если условие не выполнено, осуществляется переход к шагу 1.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
При кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; объектов данных, представленных точками в &amp;lt;math&amp;gt;\R^n&amp;lt;/math&amp;gt;, на &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; кластеров, алгоритм Fuzzy C-Means в последовательном варианте имеет вычислительную сложность – &amp;lt;math&amp;gt;O(c^2 MI+cMnI)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; – число итераций. Если считать размерность данных &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; малой, то эта сложность сводится к &amp;lt;math&amp;gt;O(c^2 MI)&amp;lt;/math&amp;gt;. Основной частью алгоритма в этом случае является пересчёт матрицы принадлежностей, требующий вычисления &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt; сумм из &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; слагаемых на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Приведём граф единичной итерации алгоритма в параллельном оптимизированном варианте:&lt;br /&gt;
&lt;br /&gt;
[[File:C-means_paralle_graph.png|thumb|upright=2.5|frame|center|alt=Paralel Fuzzy C-Means|Каждая вершина данного графа соответствует операциям из алгоритма, указанным при помощи указанных формул. Каждый из p столбцов соответствует работе одного из процессов. Пометки справа указывают число повторений каждого узла в ходе одной итерации.]]&lt;br /&gt;
&lt;br /&gt;
Раздел 1.8 уточняет, соответствуют ли эти повторения однотипным ярусам или точкам данных, вычисления для которых можно распараллелить и далее.&lt;br /&gt;
&lt;br /&gt;
Каждый процесс обладает следующими данными:&lt;br /&gt;
* координатами точек данных &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p}+1)}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;rnk&amp;lt;/math&amp;gt; – номер процесса,&lt;br /&gt;
* значениями &amp;lt;math&amp;gt;\mu_{ki}&amp;lt;/math&amp;gt; степени принадлежности для своих точек (&amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p} +1)}, i=\overline{1,c}&amp;lt;/math&amp;gt;),&lt;br /&gt;
* координатами центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=\overline{1,c}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Суммы &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m X_k}&amp;lt;/math&amp;gt; вычисляются одновременно, поэтому значения &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; вычисляются по одному разу за итерацию. Таким образом, второй ярус операций на рисунке на деле не содержит операций возведения в степень.&lt;br /&gt;
За счёт линейности большинства выражений относительно данных по точкам, процессы взаимодействуют только при редукции сумм, составляющих &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;. Всё остальное время каждый процессор работает только со своими &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точками. Это обеспечивает применимость алгоритма для больших &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
При распараллеливании по точкам исходных данных выполнение одной итерации алгоритма FCM может быть разделено на следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм знаменателя (по &amp;lt;math&amp;gt;\frac{M}{p}-1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; операций возведения в степень на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм числителя (по &amp;lt;math&amp;gt;\frac{M}{p} -1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; умножений на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; редукций сумм и передач значений &amp;lt;math&amp;gt;V_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;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; умножений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов вычисления степеней принадлежности точек (по &amp;lt;math&amp;gt;c+1&amp;lt;/math&amp;gt; делений, c возведений в степень, &amp;lt;math&amp;gt;c-1&amp;lt;/math&amp;gt; сложений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку.&lt;br /&gt;
Таким образом, при распараллеливании по точкам исходных данных при условии наличия в каждом узле достаточного объёма памяти для хранения всего массива координат центров кластеров высота и ширина ЯПФ алгоритма FCM равны соответственно &amp;lt;math&amp;gt;O(c^2 I+cnI)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: массив векторов &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt;, число кластеров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt; для входных векторов, 3 вспомогательных параметра.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;). Условие нормировки: &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
В случае неограниченного распараллеливания по точкам данных (1 процесс на точку), отношение последовательной сложности алгоритма к параллельной пропорционально &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; задаёт степень «размытости» кластеров. В отсутствие априорных данных его обычно берут равным 2. В предельном случае сведения параметра &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; к значению 1, кластеры становятся чёткими и алгоритм вырождается в алгоритм кластеризации K-Means.&lt;br /&gt;
&lt;br /&gt;
Алгоритм недетерминирован, начальное положение кластеров задаётся случайно либо явно, либо опосредованно (через матрицу принадлежности). Алгоритм сходится к локальному экстремуму &amp;lt;ref&amp;gt;Höppner, F., Klawonn, F.: [https://public.fh wolfenbuettel.de/~klawonn/Papers/hoeppnerklawonntfs03.pdf A Contribution to Convergence Theory of Fuzzy c-Means and Derivatives], Дата последнего обращения: 13.10.2016&amp;lt;/ref&amp;gt; и, таким образом, не гарантирует оптимальный результат при случайном выборе начальных значений.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
* пакет MATLAB &amp;lt;ref&amp;gt;[http://www.mathworks.com/help/fuzzy/fcm.html Документация пакета MATLAB, функция fcm], последнее обращение 15.10.2016&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Реализация алгоритма на POSTGRESQL &amp;lt;ref&amp;gt;[http://num-meth.srcc.msu.ru/zhurnal/tom_2012/pdf/v13r207.pdf Реализация алгоритма Fuzzy C-means на POSTGRESQL], последнее обращение 15.10.2016&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en:Parallel Fuzzy c-Means Clustering]]&lt;/div&gt;</summary>
		<author><name>Illusive mike</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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=10067</id>
		<title>Участник:Nikmedoed/Нечеткий алгоритм С-средних (Fuzzy 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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=10067"/>
		<updated>2016-10-15T14:55:26Z</updated>

		<summary type="html">&lt;p&gt;Illusive mike: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Нечеткий алгоритм С-средних (Fuzzy C-means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(c^2 MI + cMnI), (I&amp;lt;/math&amp;gt; - число итераций, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - число точек, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - размерность точек (свойств на объект)&amp;lt;math&amp;gt;)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; O(c^2 I + cnI)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O( M )&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Выполняют: [[Участник:Nikmedoed|Н.А. Муромцев]], [[Участник:illusive_mike|М.С. Дворецкий]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Нечеткий алгоритм С-средних&#039;&#039;&#039; (&#039;&#039;Fuzzy C-means&#039;&#039;) - позволяет получить нечёткую кластеризация больших наборов числовых данных, что позволяет определять объекты на границе кластеров в отдельные кластеры. Однако, выполнение данного алгоритма требует серьёзных вычислительных ресурсов, а также изначального задания количества кластеров. Кроме того, может возникнуть неоднозначность с объектами удалёнными от центров всех кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм кластеризации Fuzzy C-Means (FCM) был предложен Дж. Данном в 1973 году &amp;lt;ref&amp;gt;Dunn, J.C.: A Fuzzy Relative of the ISODATA Process and Its Use in Detecting Compact Well-Separated Clusters. Journal of Cybernetics. 3 (1973): 32–57&amp;lt;/ref&amp;gt; и доработан Дж. Бездеком в 1981 году &amp;lt;ref&amp;gt;Bezdek, J.C.: Pattern Recognition with Fuzzy Objective Function Algorithms. Plenum Press, New York (1981). ISBN 0-306-40671-3&amp;lt;/ref&amp;gt;. В отличие от большинства существующих алгоритмов кластеризации, данный алгоритм является нечётким – каждый из объектов не входит однозначно в какой-либо кластер, а принадлежит всем кластерам с различными степенями принадлежности. Это даёт преимущества в качестве разбиения в случаях, когда кластеры находятся близко друг к другу, и большое число точек находится на их границах. Однако ценой такой нечёткости служат большие вычислительные затраты, чем у таких чётких алгоритмов, как [[Hard C-Means]] и [[K-Means]], при сохранении таких их недостатков, как априорное определение числа кластеров и отсутствие гарантии глобальной оптимальности результата.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Исходные данные: массив объектов &amp;lt;math&amp;gt;{X_k}\in{\R^n}, k=\overline{1,M}&amp;lt;/math&amp;gt;, число кластеров c, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные: матрица разбиения &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;M\times c&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;), центры кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, расстояния &amp;lt;math&amp;gt;D_{ki}&amp;lt;/math&amp;gt; между объектами и центрами кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;V_i=\frac{\sum^{M}_{k=1} {\mu^m_{ki} * X_k}}{\sum^{M}_{k=1} {\mu^m_{ki}}},i=\overline{1,c}\\&lt;br /&gt;
&amp;amp;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}\\&lt;br /&gt;
&amp;amp;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} \left ( {\frac{D_{ki}}{D_{kj}}} \right ) }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Вычислительное ядро алгоритма Fuzzy C-Means составляют шаги вычисления центров кластеров, расстояний между ними и точками данных и в особенности пересчёта матрицы степеней принадлежности точек данных.&lt;br /&gt;
&lt;br /&gt;
При реальном вычислении некоторые повторяющиеся вычисления могут быть устранены. Так, для шага вычисления центров кластеров величины &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; могут вычисляться однократно и умножаться на &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt; при включении в сумму, записанную в числителе. Для шага вычисления расстояний между центрами кластеров и точками, операция взятия квадратного корня не является обязательной, так как в дальнейшем на шаге вычисления степеней принадлежности можно непосредственно использовать квадраты этих расстояний, и сумма в знаменателе будет приобретать вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum^{c}_{j=1} {\left ( \frac{D_{ki} ^ {2}}{D_{kj} ^ {2}} \right )}^{{1}/{m-1}}&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;
Инициализация происходит случайным заполнением матрицы принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; с соблюдением условия нормировки &amp;lt;math&amp;gt;\sum_{i=1}^c {\mu_{ki} =1}&amp;lt;/math&amp;gt; и переходом к шагу 1, либо случайным определением центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt; и переходом к шагу 2.&lt;br /&gt;
&lt;br /&gt;
Далее осуществляются итерации следующего вида:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;V_i=\frac{\sum_{k=1}^{M} {\mu_{ki}^m * X_k}}{\sum_{k=1}^{M} {\mu_{ki}^m} },i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} {\left ( \frac{D_{ki}}{D_{kj}} \right )} }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конце каждой итерации проверяется условие останова вида &amp;lt;math&amp;gt;\max_{k = \overline{1,M},i = \overline{1,c}} {( \left | \mu_{ki} - \mu_{ki}^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, либо &amp;lt;math&amp;gt;\max_{i = \overline{1,c}} {( \left | V_i - V_i^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mu_{ki}^* (V_i^*)&amp;lt;/math&amp;gt; – значение &amp;lt;math&amp;gt;\mu_{ki}(V_i)&amp;lt;/math&amp;gt;, вычисленное на предыдущей итерации. Если условие не выполнено, осуществляется переход к шагу 1.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
При кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; объектов данных, представленных точками в &amp;lt;math&amp;gt;\R^n&amp;lt;/math&amp;gt;, на &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; кластеров, алгоритм Fuzzy C-Means в последовательном варианте имеет вычислительную сложность – &amp;lt;math&amp;gt;O(c^2 MI+cMnI)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; – число итераций. Если считать размерность данных &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; малой, то эта сложность сводится к &amp;lt;math&amp;gt;O(c^2 MI)&amp;lt;/math&amp;gt;. Основной частью алгоритма в этом случае является пересчёт матрицы принадлежностей, требующий вычисления &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt; сумм из &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; слагаемых на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Приведём граф единичной итерации алгоритма в параллельном оптимизированном варианте:&lt;br /&gt;
&lt;br /&gt;
[[File:C-means_paralle_graph.png|thumb|upright=2.5|frame|center|alt=Paralel Fuzzy C-Means|Каждая вершина данного графа соответствует операциям из алгоритма, указанным при помощи указанных формул. Каждый из p столбцов соответствует работе одного из процессов. Пометки справа указывают число повторений каждого узла в ходе одной итерации.]]&lt;br /&gt;
&lt;br /&gt;
Раздел 1.8 уточняет, соответствуют ли эти повторения однотипным ярусам или точкам данных, вычисления для которых можно распараллелить и далее.&lt;br /&gt;
&lt;br /&gt;
Каждый процесс обладает следующими данными:&lt;br /&gt;
* координатами точек данных &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p}+1)}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;rnk&amp;lt;/math&amp;gt; – номер процесса,&lt;br /&gt;
* значениями &amp;lt;math&amp;gt;\mu_{ki}&amp;lt;/math&amp;gt; степени принадлежности для своих точек (&amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p} +1)}, i=\overline{1,c}&amp;lt;/math&amp;gt;),&lt;br /&gt;
* координатами центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=\overline{1,c}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Суммы &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m X_k}&amp;lt;/math&amp;gt; вычисляются одновременно, поэтому значения &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; вычисляются по одному разу за итерацию. Таким образом, второй ярус операций на рисунке на деле не содержит операций возведения в степень.&lt;br /&gt;
За счёт линейности большинства выражений относительно данных по точкам, процессы взаимодействуют только при редукции сумм, составляющих &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;. Всё остальное время каждый процессор работает только со своими &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точками. Это обеспечивает применимость алгоритма для больших &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
При распараллеливании по точкам исходных данных выполнение одной итерации алгоритма FCM может быть разделено на следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм знаменателя (по &amp;lt;math&amp;gt;\frac{M}{p}-1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; операций возведения в степень на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм числителя (по &amp;lt;math&amp;gt;\frac{M}{p} -1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; умножений на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; редукций сумм и передач значений &amp;lt;math&amp;gt;V_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;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; умножений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов вычисления степеней принадлежности точек (по &amp;lt;math&amp;gt;c+1&amp;lt;/math&amp;gt; делений, c возведений в степень, &amp;lt;math&amp;gt;c-1&amp;lt;/math&amp;gt; сложений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку.&lt;br /&gt;
Таким образом, при распараллеливании по точкам исходных данных при условии наличия в каждом узле достаточного объёма памяти для хранения всего массива координат центров кластеров высота и ширина ЯПФ алгоритма FCM равны соответственно &amp;lt;math&amp;gt;O(c^2 I+cnI)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: массив векторов &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt;, число кластеров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt; для входных векторов, 3 вспомогательных параметра.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;). Условие нормировки: &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
В случае неограниченного распараллеливания по точкам данных (1 процесс на точку), отношение последовательной сложности алгоритма к параллельной пропорционально &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; задаёт степень «размытости» кластеров. В отсутствие априорных данных его обычно берут равным 2. В предельном случае сведения параметра &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; к значению 1, кластеры становятся чёткими и алгоритм вырождается в алгоритм кластеризации K-Means.&lt;br /&gt;
&lt;br /&gt;
Алгоритм недетерминирован, начальное положение кластеров задаётся случайно либо явно, либо опосредованно (через матрицу принадлежности). Алгоритм сходится к локальному экстремуму &amp;lt;ref&amp;gt;Höppner, F., Klawonn, F.: [https://public.fh wolfenbuettel.de/~klawonn/Papers/hoeppnerklawonntfs03.pdf A Contribution to Convergence Theory of Fuzzy c-Means and Derivatives], Дата последнего обращения: 13.10.2016&amp;lt;/ref&amp;gt; и, таким образом, не гарантирует оптимальный результат при случайном выборе начальных значений.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en:Parallel Fuzzy c-Means Clustering]]&lt;/div&gt;</summary>
		<author><name>Illusive mike</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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=10055</id>
		<title>Участник:Nikmedoed/Нечеткий алгоритм С-средних (Fuzzy 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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=10055"/>
		<updated>2016-10-15T14:53:52Z</updated>

		<summary type="html">&lt;p&gt;Illusive mike: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Нечеткий алгоритм С-средних (Fuzzy C-means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(c^2 MI + cMnI), (I&amp;lt;/math&amp;gt; - число итераций, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - число точек, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - размерность точек (свойств на объект)&amp;lt;math&amp;gt;)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; O(c^2 I + cnI)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O( M )&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Выполняют: [[Участник:Nikmedoed|Н.А. Муромцев]], [[Участник:illusive_mike|М.С. Дворецкий]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Нечеткий алгоритм С-средних&#039;&#039;&#039; (&#039;&#039;Fuzzy C-means&#039;&#039;) - позволяет получить нечёткую кластеризация больших наборов числовых данных, что позволяет определять объекты на границе кластеров в отдельные кластеры. Однако, выполнение данного алгоритма требует серьёзных вычислительных ресурсов, а также изначального задания количества кластеров. Кроме того, может возникнуть неоднозначность с объектами удалёнными от центров всех кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм кластеризации Fuzzy C-Means (FCM) был предложен Дж. Данном в 1973 году &amp;lt;ref&amp;gt;Dunn, J.C.: A Fuzzy Relative of the ISODATA Process and Its Use in Detecting Compact Well-Separated Clusters. Journal of Cybernetics. 3 (1973): 32–57&amp;lt;/ref&amp;gt; и доработан Дж. Бездеком в 1981 году &amp;lt;ref&amp;gt;Bezdek, J.C.: Pattern Recognition with Fuzzy Objective Function Algorithms. Plenum Press, New York (1981). ISBN 0-306-40671-3&amp;lt;/ref&amp;gt;. В отличие от большинства существующих алгоритмов кластеризации, данный алгоритм является нечётким – каждый из объектов не входит однозначно в какой-либо кластер, а принадлежит всем кластерам с различными степенями принадлежности. Это даёт преимущества в качестве разбиения в случаях, когда кластеры находятся близко друг к другу, и большое число точек находится на их границах. Однако ценой такой нечёткости служат большие вычислительные затраты, чем у таких чётких алгоритмов, как [[Hard C-Means]] и [[K-Means]], при сохранении таких их недостатков, как априорное определение числа кластеров и отсутствие гарантии глобальной оптимальности результата.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Исходные данные: массив объектов &amp;lt;math&amp;gt;{X_k}\in{\R^n}, k=\overline{1,M}&amp;lt;/math&amp;gt;, число кластеров c, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные: матрица разбиения &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;M\times c&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;), центры кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, расстояния &amp;lt;math&amp;gt;D_{ki}&amp;lt;/math&amp;gt; между объектами и центрами кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;V_i=\frac{\sum^{M}_{k=1} {\mu^m_{ki} * X_k}}{\sum^{M}_{k=1} {\mu^m_{ki}}},i=\overline{1,c}\\&lt;br /&gt;
&amp;amp;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}\\&lt;br /&gt;
&amp;amp;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} \left ( {\frac{D_{ki}}{D_{kj}}} \right ) }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Вычислительное ядро алгоритма Fuzzy C-Means составляют шаги вычисления центров кластеров, расстояний между ними и точками данных и в особенности пересчёта матрицы степеней принадлежности точек данных.&lt;br /&gt;
&lt;br /&gt;
При реальном вычислении некоторые повторяющиеся вычисления могут быть устранены. Так, для шага вычисления центров кластеров величины &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; могут вычисляться однократно и умножаться на &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt; при включении в сумму, записанную в числителе.Для шага вычисления расстояний между центрами кластеров и точками, операция взятия квадратного корня не является обязательной, так как в дальнейшем на шаге вычисления степеней принадлежности можно непосредственно использовать квадраты этих расстояний, и сумма в знаменателе будет приобретать вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum^{c}_{j=1} {\left ( \frac{D_{ki} ^ {2}}{D_{kj} ^ {2}} \right )}^{{1}/{m-1}}&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;
Инициализация происходит случайным заполнением матрицы принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; с соблюдением условия нормировки &amp;lt;math&amp;gt;\sum_{i=1}^c {\mu_{ki} =1}&amp;lt;/math&amp;gt; и переходом к шагу 1, либо случайным определением центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt; и переходом к шагу 2.&lt;br /&gt;
&lt;br /&gt;
Далее осуществляются итерации следующего вида:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;V_i=\frac{\sum_{k=1}^{M} {\mu_{ki}^m * X_k}}{\sum_{k=1}^{M} {\mu_{ki}^m} },i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} {\left ( \frac{D_{ki}}{D_{kj}} \right )} }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конце каждой итерации проверяется условие останова вида &amp;lt;math&amp;gt;\max_{k = \overline{1,M},i = \overline{1,c}} {( \left | \mu_{ki} - \mu_{ki}^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, либо &amp;lt;math&amp;gt;\max_{i = \overline{1,c}} {( \left | V_i - V_i^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mu_{ki}^* (V_i^*)&amp;lt;/math&amp;gt; – значение &amp;lt;math&amp;gt;\mu_{ki}(V_i)&amp;lt;/math&amp;gt;, вычисленное на предыдущей итерации. Если условие не выполнено, осуществляется переход к шагу 1.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
При кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; объектов данных, представленных точками в &amp;lt;math&amp;gt;\R^n&amp;lt;/math&amp;gt;, на &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; кластеров, алгоритм Fuzzy C-Means в последовательном варианте имеет вычислительную сложность – &amp;lt;math&amp;gt;O(c^2 MI+cMnI)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; – число итераций. Если считать размерность данных &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; малой, то эта сложность сводится к &amp;lt;math&amp;gt;O(c^2 MI)&amp;lt;/math&amp;gt;. Основной частью алгоритма в этом случае является пересчёт матрицы принадлежностей, требующий вычисления &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt; сумм из &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; слагаемых на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Приведём граф единичной итерации алгоритма в параллельном оптимизированном варианте:&lt;br /&gt;
&lt;br /&gt;
[[File:C-means_paralle_graph.png|thumb|upright=2.5|frame|center|alt=Paralel Fuzzy C-Means|Каждая вершина данного графа соответствует операциям из алгоритма, указанным при помощи указанных формул. Каждый из p столбцов соответствует работе одного из процессов. Пометки справа указывают число повторений каждого узла в ходе одной итерации.]]&lt;br /&gt;
&lt;br /&gt;
Раздел 1.8 уточняет, соответствуют ли эти повторения однотипным ярусам или точкам данных, вычисления для которых можно распараллелить и далее.&lt;br /&gt;
&lt;br /&gt;
Каждый процесс обладает следующими данными:&lt;br /&gt;
* координатами точек данных &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p}+1)}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;rnk&amp;lt;/math&amp;gt; – номер процесса,&lt;br /&gt;
* значениями &amp;lt;math&amp;gt;\mu_{ki}&amp;lt;/math&amp;gt; степени принадлежности для своих точек (&amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p} +1)}, i=\overline{1,c}&amp;lt;/math&amp;gt;),&lt;br /&gt;
* координатами центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=\overline{1,c}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Суммы &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m X_k}&amp;lt;/math&amp;gt; вычисляются одновременно, поэтому значения &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; вычисляются по одному разу за итерацию. Таким образом, второй ярус операций на рисунке на деле не содержит операций возведения в степень.&lt;br /&gt;
За счёт линейности большинства выражений относительно данных по точкам, процессы взаимодействуют только при редукции сумм, составляющих &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;. Всё остальное время каждый процессор работает только со своими &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точками. Это обеспечивает применимость алгоритма для больших &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
При распараллеливании по точкам исходных данных выполнение одной итерации алгоритма FCM может быть разделено на следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм знаменателя (по &amp;lt;math&amp;gt;\frac{M}{p}-1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; операций возведения в степень на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм числителя (по &amp;lt;math&amp;gt;\frac{M}{p} -1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; умножений на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; редукций сумм и передач значений &amp;lt;math&amp;gt;V_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;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; умножений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов вычисления степеней принадлежности точек (по &amp;lt;math&amp;gt;c+1&amp;lt;/math&amp;gt; делений, c возведений в степень, &amp;lt;math&amp;gt;c-1&amp;lt;/math&amp;gt; сложений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку.&lt;br /&gt;
Таким образом, при распараллеливании по точкам исходных данных при условии наличия в каждом узле достаточного объёма памяти для хранения всего массива координат центров кластеров высота и ширина ЯПФ алгоритма FCM равны соответственно &amp;lt;math&amp;gt;O(c^2 I+cnI)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: массив векторов &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt;, число кластеров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt; для входных векторов, 3 вспомогательных параметра.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;). Условие нормировки: &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
В случае неограниченного распараллеливания по точкам данных (1 процесс на точку), отношение последовательной сложности алгоритма к параллельной пропорционально &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; задаёт степень «размытости» кластеров. В отсутствие априорных данных его обычно берут равным 2. В предельном случае сведения параметра &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; к значению 1, кластеры становятся чёткими и алгоритм вырождается в алгоритм кластеризации K-Means.&lt;br /&gt;
&lt;br /&gt;
Алгоритм недетерминирован, начальное положение кластеров задаётся случайно либо явно, либо опосредованно (через матрицу принадлежности). Алгоритм сходится к локальному экстремуму &amp;lt;ref&amp;gt;Höppner, F., Klawonn, F.: [https://public.fh wolfenbuettel.de/~klawonn/Papers/hoeppnerklawonntfs03.pdf A Contribution to Convergence Theory of Fuzzy c-Means and Derivatives], Дата последнего обращения: 13.10.2016&amp;lt;/ref&amp;gt; и, таким образом, не гарантирует оптимальный результат при случайном выборе начальных значений.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en:Parallel Fuzzy c-Means Clustering]]&lt;/div&gt;</summary>
		<author><name>Illusive mike</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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=10051</id>
		<title>Участник:Nikmedoed/Нечеткий алгоритм С-средних (Fuzzy 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:Nikmedoed/%D0%9D%D0%B5%D1%87%D0%B5%D1%82%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A1-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85_(Fuzzy_C-means)&amp;diff=10051"/>
		<updated>2016-10-15T14:53:03Z</updated>

		<summary type="html">&lt;p&gt;Illusive mike: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Нечеткий алгоритм С-средних (Fuzzy C-means)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(c^2 MI + cMnI), (I&amp;lt;/math&amp;gt; - число итераций, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - число точек, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - размерность точек (свойств на объект)&amp;lt;math&amp;gt;)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; O(c^2 I + cnI)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O( M )&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Выполняют: [[Участник:Nikmedoed|Н.А. Муромцев]], [[Участник:illusive_mike|М.С. Дворецкий]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Нечеткий алгоритм С-средних&#039;&#039;&#039; (&#039;&#039;Fuzzy C-means&#039;&#039;) - позволяет получить нечёткую кластеризация больших наборов числовых данных, что позволяет определять объекты на границе кластеров в отдельные кластеры. Однако, выполнение данного алгоритма требует серьёзных вычислительных ресурсов, а также изначального задания количества кластеров. Кроме того, может возникнуть неоднозначность с объектами удалёнными от центров всех кластеров.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм кластеризации Fuzzy C-Means (FCM) был предложен Дж. Данном в 1973 году &amp;lt;ref&amp;gt;Dunn, J.C.: A Fuzzy Relative of the ISODATA Process and Its Use in Detecting Compact Well-Separated Clusters. Journal of Cybernetics. 3 (1973): 32–57&amp;lt;/ref&amp;gt; и доработан Дж. Бездеком в 1981 году &amp;lt;ref&amp;gt;Bezdek, J.C.: Pattern Recognition with Fuzzy Objective Function Algorithms. Plenum Press, New York (1981). ISBN 0-306-40671-3&amp;lt;/ref&amp;gt;. В отличие от большинства существующих алгоритмов кластеризации, данный алгоритм является нечётким – каждый из объектов не входит однозначно в какой-либо кластер, а принадлежит всем кластерам с различными степенями принадлежности. Это даёт преимущества в качестве разбиения в случаях, когда кластеры находятся близко друг к другу, и большое число точек находится на их границах. Однако ценой такой нечёткости служат большие вычислительные затраты, чем у таких чётких алгоритмов, как [[Hard C-Means]] и [[K-Means]], при сохранении таких их недостатков, как априорное определение числа кластеров и отсутствие гарантии глобальной оптимальности результата.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Исходные данные: массив объектов &amp;lt;math&amp;gt;{X_k}\in{\R^n}, k=\overline{1,M}&amp;lt;/math&amp;gt;, число кластеров c, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные: матрица разбиения &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;M\times c&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;), центры кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, расстояния &amp;lt;math&amp;gt;D_{ki}&amp;lt;/math&amp;gt; между объектами и центрами кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;V_i=\frac{\sum^{M}_{k=1} {\mu^m_{ki} * X_k}}{\sum^{M}_{k=1} {\mu^m_{ki}}},i=\overline{1,c}\\&lt;br /&gt;
&amp;amp;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}\\&lt;br /&gt;
&amp;amp;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} \left ( {\frac{D_{ki}}{D_{kj}}} \right ) }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Вычислительное ядро алгоритма Fuzzy C-Means составляют шаги вычисления центров кластеров, расстояний между ними и точками данных и в особенности пересчёта матрицы степеней принадлежности точек данных.&lt;br /&gt;
&lt;br /&gt;
При реальном вычислении некоторые повторяющиеся вычисления могут быть устранены. Так, для шага вычисления центров кластеров величины &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; могут вычисляться однократно и умножаться на &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt; при включении в сумму, записанную в числителе.Для шага вычисления расстояний между центрами кластеров и точками, операция взятия квадратного корня не является обязательной, так как в дальнейшем на шаге вычисления степеней принадлежности можно непосредственно использовать квадраты этих расстояний, и сумма в знаменателе будет приобретать вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum^{c}_{j=1} {\left ( \frac{D_{ki}}{D_{kj}} \right )}^{{2}/{m-1}}&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;
Инициализация происходит случайным заполнением матрицы принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; с соблюдением условия нормировки &amp;lt;math&amp;gt;\sum_{i=1}^c {\mu_{ki} =1}&amp;lt;/math&amp;gt; и переходом к шагу 1, либо случайным определением центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt; и переходом к шагу 2.&lt;br /&gt;
&lt;br /&gt;
Далее осуществляются итерации следующего вида:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;V_i=\frac{\sum_{k=1}^{M} {\mu_{ki}^m * X_k}}{\sum_{k=1}^{M} {\mu_{ki}^m} },i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;D_{ki}=\sqrt{{\lVert X_k - V_i \rVert}^2},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\mu_{ki}=\frac{1}{{ \sum^{c}_{j=1} {\left ( \frac{D_{ki}}{D_{kj}} \right )} }^{{2}/{m-1}}&lt;br /&gt;
},k=\overline{1,M},i=\overline{1,c}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конце каждой итерации проверяется условие останова вида &amp;lt;math&amp;gt;\max_{k = \overline{1,M},i = \overline{1,c}} {( \left | \mu_{ki} - \mu_{ki}^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, либо &amp;lt;math&amp;gt;\max_{i = \overline{1,c}} {( \left | V_i - V_i^* \right |)} &amp;lt; \varepsilon&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mu_{ki}^* (V_i^*)&amp;lt;/math&amp;gt; – значение &amp;lt;math&amp;gt;\mu_{ki}(V_i)&amp;lt;/math&amp;gt;, вычисленное на предыдущей итерации. Если условие не выполнено, осуществляется переход к шагу 1.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
При кластеризации &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; объектов данных, представленных точками в &amp;lt;math&amp;gt;\R^n&amp;lt;/math&amp;gt;, на &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; кластеров, алгоритм Fuzzy C-Means в последовательном варианте имеет вычислительную сложность – &amp;lt;math&amp;gt;O(c^2 MI+cMnI)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; – число итераций. Если считать размерность данных &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; малой, то эта сложность сводится к &amp;lt;math&amp;gt;O(c^2 MI)&amp;lt;/math&amp;gt;. Основной частью алгоритма в этом случае является пересчёт матрицы принадлежностей, требующий вычисления &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt; сумм из &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; слагаемых на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Приведём граф единичной итерации алгоритма в параллельном оптимизированном варианте:&lt;br /&gt;
&lt;br /&gt;
[[File:C-means_paralle_graph.png|thumb|upright=2.5|frame|center|alt=Paralel Fuzzy C-Means|Каждая вершина данного графа соответствует операциям из алгоритма, указанным при помощи указанных формул. Каждый из p столбцов соответствует работе одного из процессов. Пометки справа указывают число повторений каждого узла в ходе одной итерации.]]&lt;br /&gt;
&lt;br /&gt;
Раздел 1.8 уточняет, соответствуют ли эти повторения однотипным ярусам или точкам данных, вычисления для которых можно распараллелить и далее.&lt;br /&gt;
&lt;br /&gt;
Каждый процесс обладает следующими данными:&lt;br /&gt;
* координатами точек данных &amp;lt;math&amp;gt;X_k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p}+1)}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;rnk&amp;lt;/math&amp;gt; – номер процесса,&lt;br /&gt;
* значениями &amp;lt;math&amp;gt;\mu_{ki}&amp;lt;/math&amp;gt; степени принадлежности для своих точек (&amp;lt;math&amp;gt;k=\overline{1+rnk* \frac{M}{p},rnk*(\frac{M}{p} +1)}, i=\overline{1,c}&amp;lt;/math&amp;gt;),&lt;br /&gt;
* координатами центров кластеров &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=\overline{1,c}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Суммы &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sum_{k=1+rnk*\frac{M}{p}}^{rnk * ( \frac{M}{p} +1 )} {\mu_{ki}^m X_k}&amp;lt;/math&amp;gt; вычисляются одновременно, поэтому значения &amp;lt;math&amp;gt;\mu_{ki}^m&amp;lt;/math&amp;gt; вычисляются по одному разу за итерацию. Таким образом, второй ярус операций на рисунке на деле не содержит операций возведения в степень.&lt;br /&gt;
За счёт линейности большинства выражений относительно данных по точкам, процессы взаимодействуют только при редукции сумм, составляющих &amp;lt;math&amp;gt;V_i&amp;lt;/math&amp;gt;. Всё остальное время каждый процессор работает только со своими &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точками. Это обеспечивает применимость алгоритма для больших &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
При распараллеливании по точкам исходных данных выполнение одной итерации алгоритма FCM может быть разделено на следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм знаменателя (по &amp;lt;math&amp;gt;\frac{M}{p}-1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; операций возведения в степень на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов нахождения частичных сумм числителя (по &amp;lt;math&amp;gt;\frac{M}{p} -1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; умножений на процесс),&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; редукций сумм и передач значений &amp;lt;math&amp;gt;V_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;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; умножений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку,&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; ярусов вычисления степеней принадлежности точек (по &amp;lt;math&amp;gt;c+1&amp;lt;/math&amp;gt; делений, c возведений в степень, &amp;lt;math&amp;gt;c-1&amp;lt;/math&amp;gt; сложений), каждый процесс получает &amp;lt;math&amp;gt;\frac{M}{p}&amp;lt;/math&amp;gt; точек на обработку.&lt;br /&gt;
Таким образом, при распараллеливании по точкам исходных данных при условии наличия в каждом узле достаточного объёма памяти для хранения всего массива координат центров кластеров высота и ширина ЯПФ алгоритма FCM равны соответственно &amp;lt;math&amp;gt;O(c^2 I+cnI)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: массив векторов &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt;, число кластеров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, экспоненциальный вес &amp;lt;math&amp;gt;m\in{[1,\infty)}&amp;lt;/math&amp;gt;, параметр останова &amp;lt;math&amp;gt;\varepsilon&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;Mn&amp;lt;/math&amp;gt; для входных векторов, 3 вспомогательных параметра.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица принадлежности &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mu_{ki}\in[0,1]&amp;lt;/math&amp;gt;). Условие нормировки: &amp;lt;math&amp;gt;\sum^{c}_{i=1} {\mu_{ki}} = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;cM&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
В случае неограниченного распараллеливания по точкам данных (1 процесс на точку), отношение последовательной сложности алгоритма к параллельной пропорционально &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; задаёт степень «размытости» кластеров. В отсутствие априорных данных его обычно берут равным 2. В предельном случае сведения параметра &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; к значению 1, кластеры становятся чёткими и алгоритм вырождается в алгоритм кластеризации K-Means.&lt;br /&gt;
&lt;br /&gt;
Алгоритм недетерминирован, начальное положение кластеров задаётся случайно либо явно, либо опосредованно (через матрицу принадлежности). Алгоритм сходится к локальному экстремуму &amp;lt;ref&amp;gt;Höppner, F., Klawonn, F.: [https://public.fh wolfenbuettel.de/~klawonn/Papers/hoeppnerklawonntfs03.pdf A Contribution to Convergence Theory of Fuzzy c-Means and Derivatives], Дата последнего обращения: 13.10.2016&amp;lt;/ref&amp;gt; и, таким образом, не гарантирует оптимальный результат при случайном выборе начальных значений.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en:Parallel Fuzzy c-Means Clustering]]&lt;/div&gt;</summary>
		<author><name>Illusive mike</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Lineprinter&amp;diff=8969</id>
		<title>Обсуждение участника:Lineprinter</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Lineprinter&amp;diff=8969"/>
		<updated>2016-10-15T10:11:22Z</updated>

		<summary type="html">&lt;p&gt;Illusive mike: /* Перенос */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Перенос ==&lt;br /&gt;
Статья: [[Участники: Бобошко А., Юмакаева А./Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 4-го порядка]];&lt;br /&gt;
Выполняют: Бобошко Алексей и Юмакаева Алина&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм кластеризации, основанный на сетях Кохоннена]];&lt;br /&gt;
Выполняют:  Логвиненко Александра и Адиев Тохтар&lt;br /&gt;
&lt;br /&gt;
Статья: [[Ортогонализация Грама-Шмидта]];&lt;br /&gt;
Выполняют: [[Участник:KibAndrey| Кибанов Андрей]] и Аджиева Татьяна&lt;br /&gt;
&lt;br /&gt;
Статья: [[Самоорганизующиеся карты Кохонена]];&lt;br /&gt;
Выполняет: [[Участник:Anton goy| Гой Антон]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[ЕМ-алгоритм_(Тематическое_моделирование)]];&lt;br /&gt;
Выполняют: Мурат Апишев и Андрей Заночкин&lt;br /&gt;
&lt;br /&gt;
Статья:[[Алгоритм_Ланцоша_с_полной_переортогонализацией]];&lt;br /&gt;
Выполняет:[[Участник:Sfedotov| Федотов С.А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм_k-средних]]&lt;br /&gt;
Выполняют: [[Участник:Error2407|Богомазов Евгений]], [[Участник:Илья_Егоров|Егоров Илья]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Нечеткий_алгоритм_С_средних]]&lt;br /&gt;
Выполняют: [[Участник:Demon smd|Д.А.Гуськов]], [[Участник:marina abramenkova|М.А.Абраменкова]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Решение_задачи_Коши_для_системы_ОДУ_методом_Рунге-Кутты_4_порядка]];&lt;br /&gt;
Выполняют: [[Участник:Алимов_Дамир_Алиевич|Алимов Дамир]] и [[Участник:Anlesnichiy|Антон Лесничий]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Строгий_алгоритм_С_средних_(Hard_C-Means,_HCM)]];&lt;br /&gt;
Выполняют: [[Участник:Светлана_Лукьяненко|Лукьяненко Светлана]] и [[Участник:Юрий_Комаров|Комаров Юрий]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм кластеризации, основанный на минимальном остовном дереве]];&lt;br /&gt;
Выполняет: [[Участник:Astandrik | Стандрик Антон Сергеевич]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Умножение разреженной матрицы на вектор]];&lt;br /&gt;
Выполняет: [[Участник:Lexaloris | Новоселов Алексей]], Выполняет: [[Участник:pahom | Кочетков Павел]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Нахождение_собственных_чисел_квадратной_матрицы_методом_QR_разложения_(3)|Нахождение собственных чисел квадратной матрицы методом QR разложения (3)]];&lt;br /&gt;
Выполняют: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод_Якоби_вычисления_сингулярных_чисел_и_векторов]];&lt;br /&gt;
Выполняют: [[Участница:Почернина_Елена| Почернина Елена]] и [[Участница:Светлана|Костюкова Светлана]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод_Ньютона_для_решения_систем_нелинейных_уравнений(2)]];&lt;br /&gt;
Выполняют: [[Участник:Oleggium|Гирняк О.Р.]], [[Участник:Dimx19|Васильков Д.А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм_кластеризации_с_использованием_представлений]];&lt;br /&gt;
Выполняют: [[Участник:Cookie|Шатков С.А.]], [[Антохина Ю.А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Быстрое_преобразование_Фурье_(FFT)|Быстрое преобразование Фурье (FFT)]];&lt;br /&gt;
Выполняют: [[Участник:Victoria_Stepanischeva|Степанищева Виктория]] и [[Участник:Igor_Munkin|Мунькин Игорь]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Быстрое_дискретное_преобразование_Фурье|Быстрое_дискретное_преобразование_Фурье]];&lt;br /&gt;
Выполняют: [[Участник:ivanov.kir.m | К.М.Иванов]], [[Участник:Pumpkin | А.C.Сапин]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Алгоритм_k_средних]]&lt;br /&gt;
Выполняют: [[Участник:Parkhomenko|Пархоменко Павел]], [[Участник:ivan.mashonskiy|Машонский Иван]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[EM-алгоритм_кластеризации]]&lt;br /&gt;
Выполняет: [[Участник:Noite|Зинченко Дмитрий]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Алгоритм_k_means]]&lt;br /&gt;
Выполняют: [[Участник:IanaV| Валуйская Яна]], [[Глотов Евгений]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод Якоби вычисления собственных значений симметричной матрицы ЗП |Метод Якоби вычисления собственных значений симметричной матрицы ЗП]];&lt;br /&gt;
Выполняют: [[Участник:Зиновьев Владимир|Зиновьев В.С.]], [[Участник:Пронин Андрей|Пронин А.М.]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Алгоритм_кластеризации,_основанный_на_минимальном_покрывающем_дереве]]&lt;br /&gt;
Выполняет: [[Участник:Kanast74|Дмитриева Анастасия]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Нахождение_собственных_чисел_квадратной_матрицы_методом_QR_разложения_(4)]]&lt;br /&gt;
Выполняют: [[Участник:F-morozov|Морозов Ф. В.]], [[Участник:Nataliya|Пащенко Н. Ф.]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Хранение_ненулевых_элементов_разреженных_матриц._Умножение_разреженной_матрицы_на_вектор]];&lt;br /&gt;
Выполняют: [[Участник:Trrufina|Третьякова Р.М.]] и [[Участник:Екатерина_Буторина|Буторина Е.В.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм_кластеризации_с_использованием_представлений2]];&lt;br /&gt;
Выполняет: [[Участник:Лукьянова Анна|Лукьянова А.Я.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод Якоби вычисления собственных значений симметричной матрицы]];&lt;br /&gt;
Выполняют: [[Участник: Galkina|Галкина А.С.]], [[Участник: Игорь|Плахов И.А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод рекурсивной координатной бисекции]];&lt;br /&gt;
Выполняют: [[Участник: Obirvalger|Гордеев Михаил]], [[Участник: KolmakovEA|Колмаков Евгений]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Итерационный метод решения системы линейных алгебраических уравнений GMRES (обобщенный метод минимальных невязок)]];&lt;br /&gt;
Выполняют: [[Участник: Эльвира Ахиярова|Ахиярова Эльвира]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Хранение ненулевых элементов разреженной матрицы. Умножение разреженной матрицы на вектор]];&lt;br /&gt;
Выполняют: [[Участник: Janyell|Сычева Евгения]], [[Участник: Ahahalin|Хахалин Анатолий]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Построение матрицы Адамара произвольного размера]];&lt;br /&gt;
Выполняют: [[Участник: Бугаков Юрий|Бугаков Юрий]], Кужамалиев Ернур&lt;br /&gt;
&lt;br /&gt;
Статья: [[Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки (1)]]&lt;br /&gt;
Выполняют: [[Участница:Sannikovats| Санникова Татьяна Сергеевна]], [[Участник:Plukshin| Лукшин Петр Андреевич]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм кластеризации, основанный на построении каркаса]];&lt;br /&gt;
Выполняют: [[Участник:SenderovichNikita| Сендерович Никита]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм кластеризации, основанный на максимизации ожидания]];&lt;br /&gt;
Выполняют: Готман Мария, Лукашкина Юлия&lt;br /&gt;
&lt;br /&gt;
Статья: [[Partitioning_Around_Medoids_(PAM)]]&lt;br /&gt;
Выполняют: [[Участник:Avasilenko|А.Э.Василенко]], [[Участник:Anastasia|А.В.Тузикова]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Нечеткий алгоритм С-средних (Fuzzy C-means)]]&lt;br /&gt;
Выполняют: [[Участник:Nikmedoed|Н.А. Муромцев]], [[Участник:illusive_mike|М.С. Дворецкий]]&lt;/div&gt;</summary>
		<author><name>Illusive mike</name></author>
	</entry>
</feed>