<?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=Msindeeva</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=Msindeeva"/>
	<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/Msindeeva"/>
	<updated>2026-10-23T07:48:26Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Msindeeva/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_k_%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85&amp;diff=24782</id>
		<title>Участник:Msindeeva/Алгоритм k средних</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:Msindeeva/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_k_%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85&amp;diff=24782"/>
		<updated>2017-12-01T01:26:48Z</updated>

		<summary type="html">&lt;p&gt;Msindeeva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Алгоритм k средних&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Автор статьи: Синдеева Мария, группа 416&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм k средних&#039;&#039;&#039; - это алгоритм кластерного анализа, используемый в Data Mining. Цель алгоритма - разделить &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров, в которых каждое наблюдение принадлежит к кластеру с ближайшим центром, который служит прототипом всего кластера. Эта задача является NP-сложной, но существуют эффективные эвристические алгоритмы, быстро сходящиеся к локальному минимуму. &lt;br /&gt;
&lt;br /&gt;
Алгоритм k средних является наиболее популярным методом кластеризации. Он был изобретён в 1950-х годах математиком Гуго Штейнгаузом и почти одновременно Стюартом Ллойдом.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входные параметры: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений (векторов) &amp;lt;math&amp;gt;(\mathbf x_1, \mathbf x_2, .. \mathbf x_n)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - число кластеров.&lt;br /&gt;
&lt;br /&gt;
Также входным параметром можно считать метрику для векторов, например евклидово расстояние &amp;lt;math&amp;gt;d(x, y) = \sum_{i = 1}^{l} (x_i - y_i )^2&amp;lt;/math&amp;gt; - одна из самых популярных используемых метрик. &lt;br /&gt;
&lt;br /&gt;
Формально нам необходимо найти такое разделение &amp;lt;math&amp;gt;(\mathbf x_1, \mathbf x_2, .. \mathbf x_n)&amp;lt;/math&amp;gt; на подмножества &amp;lt;math&amp;gt;G = (G_1, .. G_k)&amp;lt;/math&amp;gt;, минимизирующие сумму квадратов расстояний до их центров, или суммарное квадратичное отклонение:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \underset{\mathbf{G}} {\operatorname{arg\,min}}  \sum_{i=1}^{k} \sum_{\mathbf x \in G_i} d(\mathbf x, \boldsymbol\mu_i)^2,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\boldsymbol\mu_i&amp;lt;/math&amp;gt; - центр кластера &amp;lt;math&amp;gt;G_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм работает итерационно, каждая итерация алгоритма представляет собой следующее:&lt;br /&gt;
&lt;br /&gt;
* Пересчитать центр масс для каждого кластера, полученного на предыдущем шаге: &amp;lt;math&amp;gt;\boldsymbol \mu_i = \frac{\sum_{\mathbf x_i \in G_i}\mathbf x_i}{|G_i|}, i = 1, 2, .. k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Переразбить векторы на кластеры в соответствии с расстоянием до новых посчитанных центров: &amp;lt;math&amp;gt;z_i = \underset{\mathbf{j}} {\operatorname{arg\,min}} \{d(\mathbf x_i, \boldsymbol \mu_j)\}, i = 1, 2, .. n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм завершается, когда на какой-то итерации не происходит изменения центра масс кластеров. Это происходит за конечное число итераций, так как количество возможных разбиений конечного множества конечно, а на каждом шаге суммарное квадратичное отклонение &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; не увеличивается, поэтому зацикливание невозможно.&lt;br /&gt;
&lt;br /&gt;
Такой алгоритм сходится при любом начальном приближении разбиения на кластеры, поэтому в качестве нулевого шага часто выбирают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; случайных векторов среди  &amp;lt;math&amp;gt;(\mathbf x_1, \mathbf x_2, .. \mathbf x_n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Две основные составляющие алгоритма:&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма можно считать состоящим из двух частей:&lt;br /&gt;
* Пересчет расстояний ярлыков кластеров векторам. Это ядро подразумевает многократное вычисление евклидовых расстояний между &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерными векторами.&lt;br /&gt;
* Пересчет новых центроидов. В этом ядре осуществляются в основном операции сложения &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерных векторов.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм представляет собой циклическое чередование двух этапов, описанных выше, причем каждый использует результаты предыдущего. &lt;br /&gt;
&lt;br /&gt;
Так как расстояния векторов до центроидов никак не связаны друг с другом, подсчет этих расстояний выполняется параллельно друг другу.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Структура алгоритма описывается так:&lt;br /&gt;
&lt;br /&gt;
# Инициализация центроидов &amp;lt;math&amp;gt;\mu_1, ... \mu_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Последовательное вычисление расстояний векторов до этих центроидов и разбиение по кластерам с этими центрами.&lt;br /&gt;
# Нахождение изменения метрики &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;. Если оно меньше некоего заданного порога, то центроиды найдены.&lt;br /&gt;
# Пересчет центроидов в новых кластерах.&lt;br /&gt;
# Переход к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть на входе &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; векторов длины &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, выделяется &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность подсчета квадрата расстояния между двумя векторами: &amp;lt;math&amp;gt;2N - 1&amp;lt;/math&amp;gt; сложений и вычитаний, &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; умножений. Таким образом, сложность подсчета метрики &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; для одной итерации: &amp;lt;math&amp;gt;n * k * (2N - 1)&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;n * k * N&amp;lt;/math&amp;gt; умножений. Пересчет кластеров (поиск среднего ариметического векторов в кластере): &amp;lt;math&amp;gt;(n - k) * N&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;k * N&amp;lt;/math&amp;gt; делений. Итого,  если &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; - число итераций, общая сложность: &amp;lt;math&amp;gt;(n * k *(2N - 1) + n * k * N + (n - k) * N + k * N) * I = (3N * n * k - n * k + n * N) * I&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общая сложность: &amp;lt;math&amp;gt;O(NnkI)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф алгоритма ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:infograph_k_means.png|thumb|none|500px|Рисунок 1. Информационный граф алгоритма k средних]]&lt;br /&gt;
&lt;br /&gt;
# Первичная инициализация центроидов&lt;br /&gt;
# Первичная метрика&lt;br /&gt;
# Подсчет расстояния между вектором и центроидом&lt;br /&gt;
# Выбор кластера для вектора а основе расстояний до центроидов&lt;br /&gt;
# Подсчет метрики J (сумма квадратов расстояний)&lt;br /&gt;
# Расчет нового центроида&lt;br /&gt;
# Сравнение новой метрики со старой&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность второго яруса информационного графа составляет &amp;lt;math&amp;gt;3N - 1&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* Сложность третьего яруса - &amp;lt;math&amp;gt;n * k - 1&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* Сложность четвертого яруса - &amp;lt;math&amp;gt;(max(cluster size) - 1) * N + N = N * max(cluster size)&amp;lt;/math&amp;gt;, где максимальный размер кластера зависит от входных данных, но на каждой итерации не больше &amp;lt;math&amp;gt;n - k + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итого сложность при максимальной параллелизации: &amp;lt;math&amp;gt;I * (3N - 1 + n * k - 1 + (n - k + 1) * N) = I * (4N - 2 + nk + nN - kN)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(n(k+N)I)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные параметры:&#039;&#039;&#039; &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;k&amp;lt;/math&amp;gt; - число кластеров&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;O(N * n * k)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; k центроидов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;O(N * k)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Не гарантируется достижение глобального минимума суммарного квадратичного отклонения &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, а только одного из локальных минимумов.&lt;br /&gt;
* Результат зависит от выбора исходных центров кластеров, их оптимальный выбор неизвестен.&lt;br /&gt;
* Число кластеров надо знать заранее.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма === &lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Изменяемые параметры запуска реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
* Число процессоров: &amp;lt;math&amp;gt;[1, 2, 4, 8, 16, 32, 64, 128]&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Число векторов: &amp;lt;math&amp;gt;[150, 500, 100]&amp;lt;/math&amp;gt;. Размерность &amp;lt;math&amp;gt;(N = 4)&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;(k = 4)&amp;lt;/math&amp;gt; не изменяется&lt;br /&gt;
На графике показана зависимость производительности (количество операций в секунду) от числа процессов и числа векторов.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Scalability_k_means.png|thumb|none|500px|Рисунок 2. Масштабируемость алгоритма k средних]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* [http://www.ece.northwestern.edu/~wkliao/Kmeans/index.html C + MPI]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* MacQueen, J. B. (1967). &amp;quot;Some Methods for classification and Analysis of Multivariate Observations&amp;quot;&lt;br /&gt;
* MacKay, David (2003). &amp;quot;An Example Inference Task: Clustering&amp;quot;&lt;br /&gt;
* Jing Zhang, Gongqing Wu, Xuegang Hu, Shiying Li, Shuilong Hao (2012). &amp;quot;A Parallel K-Means Clustering Algorithm with MPI&amp;quot;&lt;/div&gt;</summary>
		<author><name>Msindeeva</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:Msindeeva/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_k_%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85&amp;diff=24780</id>
		<title>Участник:Msindeeva/Алгоритм k средних</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:Msindeeva/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_k_%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85&amp;diff=24780"/>
		<updated>2017-12-01T00:11:37Z</updated>

		<summary type="html">&lt;p&gt;Msindeeva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Алгоритм k средних&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Автор статьи: Синдеева Мария, группа 416&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм k средних&#039;&#039;&#039; - это алгоритм кластерного анализа, используемый в Data Mining. Цель алгоритма - разделить &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров, в которых каждое наблюдение принадлежит к кластеру с ближайшим центром, который служит прототипом всего кластера. Эта задача является NP-сложной, но существуют эффективные эвристические алгоритмы, быстро сходящиеся к локальному минимуму. &lt;br /&gt;
&lt;br /&gt;
Алгоритм k средних является наиболее популярным методом кластеризации. Он был изобретён в 1950-х годах математиком Гуго Штейнгаузом и почти одновременно Стюартом Ллойдом.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входные параметры: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений (векторов) &amp;lt;math&amp;gt;(\mathbf x_1, \mathbf x_2, .. \mathbf x_n)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - число кластеров.&lt;br /&gt;
&lt;br /&gt;
Также входным параметром можно считать метрику для векторов, например евклидово расстояние &amp;lt;math&amp;gt;d(x, y) = \sum_{i = 1}^{l} (x_i - y_i )^2&amp;lt;/math&amp;gt; - одна из самых популярных используемых метрик. &lt;br /&gt;
&lt;br /&gt;
Формально нам необходимо найти такое разделение &amp;lt;math&amp;gt;(\mathbf x_1, \mathbf x_2, .. \mathbf x_n)&amp;lt;/math&amp;gt; на подмножества &amp;lt;math&amp;gt;G = (G_1, .. G_k)&amp;lt;/math&amp;gt;, так чтобы минимизировать сумму квадратов расстояний до их центров, или суммарное квадратичное отклонение:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \underset{\mathbf{G}} {\operatorname{arg\,min}}  \sum_{i=1}^{k} \sum_{\mathbf x \in G_i} d(\mathbf x, \boldsymbol\mu_i)^2,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\boldsymbol\mu_i&amp;lt;/math&amp;gt; - центр кластера &amp;lt;math&amp;gt;G_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм работает итерационно, каждая итерация алгоритма представляет собой следующее:&lt;br /&gt;
&lt;br /&gt;
* Пересчитать центр масс для каждого кластера, полученного на предыдущем шаге: &amp;lt;math&amp;gt;\boldsymbol \mu_i = \frac{\sum_{\mathbf x_i \in G_i}\mathbf x_i}{|G_i|}, i = 1, 2, .. k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Переразбить векторы на кластеры в соответствии с расстоянием до новых посчитанных центров: &amp;lt;math&amp;gt;z_i = \underset{\mathbf{j}} {\operatorname{arg\,min}} \{d(\mathbf x_i, \boldsymbol \mu_j)\}, i = 1, 2, .. n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм завершается, когда на какой-то итерации не происходит изменения центра масс кластеров. Это происходит за конечное число итераций, так как количество возможных разбиений конечного множества конечно, а на каждом шаге суммарное квадратичное отклонение &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; не увеличивается, поэтому зацикливание невозможно.&lt;br /&gt;
&lt;br /&gt;
Такой алгоритм сходится при любом начальном приближении разбиения на кластеры, поэтому в качестве нулевого шага часто выбирают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; случайных векторов среди  &amp;lt;math&amp;gt;(\mathbf x_1, \mathbf x_2, .. \mathbf x_n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Две основные составляющие алгоритма:&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма можно считать состоящим из двух частей:&lt;br /&gt;
* Пересчет расстояний ярлыков кластеров векторам. Это ядро подразумевает многократное вычисление евклидовых расстояний между &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерными векторами.&lt;br /&gt;
* Пересчет новых центроидов. В этом ядре осуществляются в основном операции сложения &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерных векторов.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм представляет собой циклическое чередование двух этапов, описанных выше, причем каждый использует результаты предыдущего. &lt;br /&gt;
&lt;br /&gt;
Так как расстояния векторов до центроидов никак не связаны друг с другом, подсчет этих расстояний выполняется параллельно друг другу.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Структура алгоритма описывается так:&lt;br /&gt;
&lt;br /&gt;
# Инициализация центроидов &amp;lt;math&amp;gt;\mu_1, ... \mu_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Последовательное вычисление расстояний векторов до этих центроидов и разбиение по кластерам с этими центрами.&lt;br /&gt;
# Нахождение изменения метрики &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;. Если оно больше некоего заданного порога, то центроиды найдены.&lt;br /&gt;
# Пересчет центроидов в новых кластерах.&lt;br /&gt;
# Переход к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть на входе &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; векторов длины &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, выделяется &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность подсчета квадрата расстояния между двумя векторами: &amp;lt;math&amp;gt;2N - 1&amp;lt;/math&amp;gt; сложений и вычитаний, &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; умножений. Таким образом, сложность подсчета метрики &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; для одной итерации: &amp;lt;math&amp;gt;n * k * (2N - 1)&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;n * k * N&amp;lt;/math&amp;gt; умножений. Пересчет кластеров (поиск среднего ариметического векторов в кластере): &amp;lt;math&amp;gt;(n - k) * N&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;k * N&amp;lt;/math&amp;gt; делений. Итого,  если &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; - число итераций, общая сложность: &amp;lt;math&amp;gt;(n * k *(2N - 1) + n * k * N + (n - k) * N + k * N) * I = (3N * n * k - n * k + n * N) * I&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общая сложность: &amp;lt;math&amp;gt;O(NnkI)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф алгоритма ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:infograph_k_means.png|thumb|none|500px|Рисунок 1. Информационный граф алгоритма k средних]]&lt;br /&gt;
&lt;br /&gt;
# Первичная инициализация центроидов&lt;br /&gt;
# Первичная метрика&lt;br /&gt;
# Подсчет расстояния между вектором и центроидом&lt;br /&gt;
# Выбор кластера для вектора а основе расстояний до центроидов&lt;br /&gt;
# Подсчет метрики J (сумма квадратов расстояний)&lt;br /&gt;
# Расчет нового центроида&lt;br /&gt;
# Сравнение новой метрики со старой&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность второго яруса информационного графа составляет &amp;lt;math&amp;gt;3N - 1&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* Сложность третьего яруса - &amp;lt;math&amp;gt;n * k - 1&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* Сложность четвертого яруса - &amp;lt;math&amp;gt;(max(cluster size) - 1) * N + N = N * max(cluster size)&amp;lt;/math&amp;gt;, где максимальный размер кластера зависит от входных данных, но на каждой итерации не больше &amp;lt;math&amp;gt;n - k + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итого сложность при максимальной параллелизации: &amp;lt;math&amp;gt;I * (3N - 1 + n * k - 1 + (n - k + 1) * N) = I * (4N - 2 + nk + nN - kN)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(n(k+N)I)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные параметры:&#039;&#039;&#039; &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;k&amp;lt;/math&amp;gt; - число кластеров&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;O(N * n * k)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; k центроидов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;O(N * k)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Не гарантируется достижение глобального минимума суммарного квадратичного отклонения &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, а только одного из локальных минимумов.&lt;br /&gt;
* Результат зависит от выбора исходных центров кластеров, их оптимальный выбор неизвестен.&lt;br /&gt;
* Число кластеров надо знать заранее.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма === &lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Изменяемые параметры запуска реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
* Число процессоров: &amp;lt;math&amp;gt;[1, 2, 4, 8, 16, 32, 64, 128]&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Число векторов: &amp;lt;math&amp;gt;[150, 500, 100]&amp;lt;/math&amp;gt;. Размерность &amp;lt;math&amp;gt;(N = 4)&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;(k = 4)&amp;lt;/math&amp;gt; не изменяется&lt;br /&gt;
На графике показана зависимость производительности (количество операций в секунду) от числа процессов и числа векторов.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Scalability_k_means.png|thumb|none|500px|Рисунок 2. Масштабируемость алгоритма k средних]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* [http://www.ece.northwestern.edu/~wkliao/Kmeans/index.html C + MPI]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* MacQueen, J. B. (1967). &amp;quot;Some Methods for classification and Analysis of Multivariate Observations&amp;quot;&lt;br /&gt;
* MacKay, David (2003). &amp;quot;An Example Inference Task: Clustering&amp;quot;&lt;br /&gt;
* Jing Zhang, Gongqing Wu, Xuegang Hu, Shiying Li, Shuilong Hao (2012). &amp;quot;A Parallel K-Means Clustering Algorithm with MPI&amp;quot;&lt;/div&gt;</summary>
		<author><name>Msindeeva</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:Msindeeva/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_k_%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85&amp;diff=24779</id>
		<title>Участник:Msindeeva/Алгоритм k средних</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:Msindeeva/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_k_%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85&amp;diff=24779"/>
		<updated>2017-12-01T00:02:16Z</updated>

		<summary type="html">&lt;p&gt;Msindeeva: Финальная версия&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Алгоритм k средних&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Автор статьи: Синдеева Мария, группа 416&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм k средних&#039;&#039;&#039; - это алгоритм кластерного анализа, используемый в Data Mining. Цель алгоритма - разделить &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров, в которых каждое наблюдение принадлежит к кластеру с ближайшим центром, который служит прототипом всего кластера. Эта задача является NP-сложной, но существуют эффективные эвристические алгоритмы, быстро сходящиеся к локальному минимуму. &lt;br /&gt;
&lt;br /&gt;
Алгоритм k средних является наиболее популярным методом кластеризации. Он был изобретён в 1950-х годах математиком Гуго Штейнгаузом и почти одновременно Стюартом Ллойдом.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входные параметры: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений (векторов) &amp;lt;math&amp;gt;(\mathbf x_1, \mathbf x_2, .. \mathbf x_n)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - число кластеров.&lt;br /&gt;
&lt;br /&gt;
Также входным параметром можно считать метрику для векторов, например евклидово расстояние &amp;lt;math&amp;gt;d(x, y) = \sum_{i = 1}^{l} (x_i - y_i )^2&amp;lt;/math&amp;gt; - одна из самых популярных используемых метрик. &lt;br /&gt;
&lt;br /&gt;
Формально нам необходимо найти такое разделение &amp;lt;math&amp;gt;(\mathbf x_1, \mathbf x_2, .. \mathbf x_n)&amp;lt;/math&amp;gt; на подмножества &amp;lt;math&amp;gt;G = (G_1, .. G_k)&amp;lt;/math&amp;gt;, так чтобы минимизировать сумму квадратов расстояний до их центров, или суммарное квадратичное отклонение:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \underset{\mathbf{G}} {\operatorname{arg\,min}}  \sum_{i=1}^{k} \sum_{\mathbf x \in G_i} d(\mathbf x, \boldsymbol\mu_i)^2,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\boldsymbol\mu_i&amp;lt;/math&amp;gt; - центр кластера &amp;lt;math&amp;gt;G_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм работает итерационно, каждая итерация алгоритма представляет собой следующее:&lt;br /&gt;
&lt;br /&gt;
* Пересчитать центр масс для каждого кластера, полученного на предыдущем шаге: &amp;lt;math&amp;gt;\boldsymbol \mu_i = \frac{\sum_{\mathbf x_i \in G_i}\mathbf x_i}{|G_i|}, i = 1, 2, .. k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Переразбить векторы на кластеры в соответствии с расстоянием до новых посчитанных центров: &amp;lt;math&amp;gt;z_i = \underset{\mathbf{j}} {\operatorname{arg\,min}} \{d(\mathbf x_i, \boldsymbol \mu_j)\}, i = 1, 2, .. n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм завершается, когда на какой-то итерации не происходит изменения центра масс кластеров. Это происходит за конечное число итераций, так как количество возможных разбиений конечного множества конечно, а на каждом шаге суммарное квадратичное отклонение &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; не увеличивается, поэтому зацикливание невозможно.&lt;br /&gt;
&lt;br /&gt;
Такой алгоритм сходится при любом начальном приближении разбиения на кластеры, поэтому в качестве нулевого шага часто выбирают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; случайных векторов среди  &amp;lt;math&amp;gt;(\mathbf x_1, \mathbf x_2, .. \mathbf x_n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Две основные составляющие алгоритма:&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма можно считать состоящим из двух частей:&lt;br /&gt;
* Пересчет расстояний ярлыков кластеров векторам. Это ядро подразумевает многократное вычисление евклидовых расстояний между &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерными векторами.&lt;br /&gt;
* Пересчет новых центроидов. В этом ядре осуществляются в основном операции сложения &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерных векторов.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм представляет собой циклическое чередование двух этапов, описанных выше, причем каждый использует результаты предыдущего. &lt;br /&gt;
&lt;br /&gt;
Так как расстояния векторов до центроидов никак не связаны друг с другом, подсчет этих расстояний выполняется параллельно друг другу.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Структура алгоритма описывается так:&lt;br /&gt;
&lt;br /&gt;
# Инициализация центроидов &amp;lt;math&amp;gt;\mu_1, ... \mu_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Последовательное вычисление расстояний векторов до этих центроидов и разбиение по кластерам с этими центрами.&lt;br /&gt;
# Нахождение изменения метрики &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;. Если оно больше некоего заданного порога, то центроиды найдены.&lt;br /&gt;
# Пересчет центроидов в новых кластерах.&lt;br /&gt;
# Переход к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть на входе &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; векторов длины &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, выделяется &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность подсчета квадрата расстояния между двумя векторами: &amp;lt;math&amp;gt;2N - 1&amp;lt;/math&amp;gt; сложений и вычитаний, &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; умножений. Таким образом, сложность подсчета метрики &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; для одной итерации: &amp;lt;math&amp;gt;n * k * (2N - 1)&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;n * k * N&amp;lt;/math&amp;gt; умножений. Пересчет кластеров (поиск среднего ариметического векторов в кластере): &amp;lt;math&amp;gt;(n - k) * N&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;k * N&amp;lt;/math&amp;gt; делений. Итого,  если &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; - число итераций, общая сложность: &amp;lt;math&amp;gt;(n * k *(2N - 1) + n * k * N + (n - k) * N + k * N) * I = (3N * n * k - n * k + n * N) * I&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общая сложность: &amp;lt;math&amp;gt;O(NnkI)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф алгоритма ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:infograph_k_means.png|thumb|none|500px|Рисунок 1. Информационный граф алгоритма k средних]]&lt;br /&gt;
&lt;br /&gt;
# Первичная инициализация центроидов&lt;br /&gt;
# Первичная метрика&lt;br /&gt;
# Подсчет расстояния между вектором и центроидом&lt;br /&gt;
# Выбор кластера для вектора а основе расстояний до центроидов&lt;br /&gt;
# Подсчет метрики J (сумма квадратов расстояний)&lt;br /&gt;
# Расчет нового центроида&lt;br /&gt;
# Сравнение новой метрики со старой&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность второго яруса информационного графа составляет &amp;lt;math&amp;gt;3N - 1&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* Сложность третьего яруса - &amp;lt;math&amp;gt;n * k - 1&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* Сложность четвертого яруса - &amp;lt;math&amp;gt;(max(cluster size) - 1) * N + N = N * max(cluster size)&amp;lt;/math&amp;gt;, где максимальный размер кластера зависит от входных данных, но на каждой итерации не больше &amp;lt;math&amp;gt;n - k + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итого сложность при максимальной параллелизации: &amp;lt;math&amp;gt;I * (3N - 1 + n * k - 1 + (n - k + 1) * N) = I * (4N - 2 + nk + nN - kN)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(n(k+N)I)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные параметры:&#039;&#039;&#039; &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;k&amp;lt;/math&amp;gt; - число кластеров&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;O(N * n * k)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; k центроидов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;O(N * k)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Не гарантируется достижение глобального минимума суммарного квадратичного отклонения &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, а только одного из локальных минимумов.&lt;br /&gt;
* Результат зависит от выбора исходных центров кластеров, их оптимальный выбор неизвестен.&lt;br /&gt;
* Число кластеров надо знать заранее.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма === &lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Изменяемые параметры запуска реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
* Число процессоров: &amp;lt;math&amp;gt;[1, 2, 4, 8, 16, 32, 64, 128]&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Число векторов: &amp;lt;math&amp;gt;[150, 500, 100]&amp;lt;/math&amp;gt;. Размерность &amp;lt;math&amp;gt;(N = 4)&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;(k = 4)&amp;lt;/math&amp;gt; не изменяется&lt;br /&gt;
На графике показана зависимость производительности (количество операций в секунду) от числа процессов и числа векторов.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Scalability_k_means.png|thumb|none|500px|Рисунок 2. Масштабируемость]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* [http://www.ece.northwestern.edu/~wkliao/Kmeans/index.html C + MPI]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* MacQueen, J. B. (1967). &amp;quot;Some Methods for classification and Analysis of Multivariate Observations&amp;quot;&lt;br /&gt;
* MacKay, David (2003). &amp;quot;An Example Inference Task: Clustering&amp;quot;&lt;br /&gt;
* Jing Zhang, Gongqing Wu, Xuegang Hu, Shiying Li, Shuilong Hao (2012). &amp;quot;A Parallel K-Means Clustering Algorithm with MPI&amp;quot;&lt;/div&gt;</summary>
		<author><name>Msindeeva</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:Msindeeva/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_k_%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85&amp;diff=24702</id>
		<title>Участник:Msindeeva/Алгоритм k средних</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:Msindeeva/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_k_%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85&amp;diff=24702"/>
		<updated>2017-11-30T19:57:54Z</updated>

		<summary type="html">&lt;p&gt;Msindeeva: /* Свойства и структура алгоритма */ Добавлены все отсутствовавшие разделы&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Алгоритм k средних&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Автор статьи: Синдеева Мария, группа 416&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм k средних&#039;&#039;&#039; - это алгоритм кластерного анализа, используемый в Data Mining. Цель алгоритма - разделить &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров, в которых каждое наблюдение принадлежит к кластеру с ближайшим центром, который служит прототипом всего кластера. Эта задача является NP-сложной, но существуют эффективные эвристические алгоритмы, быстро сходящиеся к локальному минимуму. &lt;br /&gt;
&lt;br /&gt;
Алгоритм k средних является наиболее популярным методом кластеризации. Он был изобретён в 1950-х годах математиком Гуго Штейнгаузом и почти одновременно Стюартом Ллойдом.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входные параметры: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений (векторов) &amp;lt;math&amp;gt;(\mathbf x_1, \mathbf x_2, .. \mathbf x_n)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - число кластеров.&lt;br /&gt;
&lt;br /&gt;
Также входным параметром можно считать метрику для векторов, например евклидово расстояние &amp;lt;math&amp;gt;d(x, y) = \sum_{i = 1}^{l} (x_i - y_i )^2&amp;lt;/math&amp;gt; - одна из самых популярных используемых метрик. &lt;br /&gt;
&lt;br /&gt;
Формально нам необходимо найти такое разделение &amp;lt;math&amp;gt;(\mathbf x_1, \mathbf x_2, .. \mathbf x_n)&amp;lt;/math&amp;gt; на подмножества &amp;lt;math&amp;gt;G = (G_1, .. G_k)&amp;lt;/math&amp;gt;, так чтобы минимизировать сумму квадратов расстояний до их центров, или суммарное квадратичное отклонение:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
J = \underset{\mathbf{G}} {\operatorname{arg\,min}}  \sum_{i=1}^{k} \sum_{\mathbf x \in G_i} d(\mathbf x, \boldsymbol\mu_i)^2,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\boldsymbol\mu_i&amp;lt;/math&amp;gt; - центр кластера &amp;lt;math&amp;gt;G_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм работает итерационно, каждая итерация алгоритма представляет собой следующее:&lt;br /&gt;
&lt;br /&gt;
* Пересчитать центр масс для каждого кластера, полученного на предыдущем шаге: &amp;lt;math&amp;gt;\boldsymbol \mu_i = \frac{\sum_{\mathbf x_i \in G_i}\mathbf x_i}{|G_i|}, i = 1, 2, .. k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Переразбить векторы на кластеры в соответствии с расстоянием до новых посчитанных центров: &amp;lt;math&amp;gt;z_i = \underset{\mathbf{j}} {\operatorname{arg\,min}} \{d(\mathbf x_i, \boldsymbol \mu_j)\}, i = 1, 2, .. n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм завершается, когда на какой-то итерации не происходит изменения центра масс кластеров. Это происходит за конечное число итераций, так как количество возможных разбиений конечного множества конечно, а на каждом шаге суммарное квадратичное отклонение &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; не увеличивается, поэтому зацикливание невозможно.&lt;br /&gt;
&lt;br /&gt;
Такой алгоритм сходится при любом начальном приближении разбиения на кластеры, поэтому в качестве нулевого шага часто выбирают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; случайных векторов среди  &amp;lt;math&amp;gt;(\mathbf x_1, \mathbf x_2, .. \mathbf x_n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Две основные составляющие алгоритма:&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма можно считать состоящим из двух частей:&lt;br /&gt;
* Пересчет расстояний ярлыков кластеров векторам. Это ядро подразумевает многократное вычисление евклидовых расстояний между &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерными векторами.&lt;br /&gt;
* Пересчет новых центроидов. В этом ядре осуществляются в основном операции сложения &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерных векторов.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм представляет собой циклическое чередование двух этапов, описанных выше, причем каждый использует результаты предыдущего. &lt;br /&gt;
&lt;br /&gt;
Так как расстояния векторов до центроидов никак не связаны друг с другом, подсчет этих расстояний выполняется параллельно друг другу.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Структура алгоритма описывается так:&lt;br /&gt;
&lt;br /&gt;
# Инициализация центроидов &amp;lt;math&amp;gt;\mu_1, ... \mu_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Последовательное вычисление расстояний векторов до этих центроидов и разбиение по кластерам с этими центрами.&lt;br /&gt;
# Нахождение изменения метрики &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;. Если оно больше некоего заданного порога, то центроиды найдены.&lt;br /&gt;
# Пересчет центроидов в новых кластерах.&lt;br /&gt;
# Переход к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть на входе &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; векторов длины &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, выделяется &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность подсчета квадрата расстояния между двумя векторами: &amp;lt;math&amp;gt;2N - 1&amp;lt;/math&amp;gt; сложений и вычитаний, &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; умножений. Таким образом, сложность подсчета метрики &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; для одной итерации: &amp;lt;math&amp;gt;n * k * (2N - 1)&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;n * k * N&amp;lt;/math&amp;gt; умножений. Пересчет кластеров (поиск среднего ариметического векторов в кластере): &amp;lt;math&amp;gt;(n - k) * N&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;k * N&amp;lt;/math&amp;gt; делений. Итого,  если &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; - число итераций, общая сложность: &amp;lt;math&amp;gt;(n * k *(2N - 1) + n * k * N + (n - k) * N + k * N) * I = (3N * n * k - n * k + n * N) * I&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, общая сложность: &amp;lt;math&amp;gt;O(NnkI)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф алгоритма ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:infograph_k_means.png|thumb|none|500px|Рисунок 1. Информационный граф алгоритма k средних]]&lt;br /&gt;
&lt;br /&gt;
# Первичная инициализация центроидов&lt;br /&gt;
# Первичная метрика&lt;br /&gt;
# Подсчет расстояния между вектором и центроидом&lt;br /&gt;
# Выбор кластера для вектора а основе расстояний до центроидов&lt;br /&gt;
# Подсчет метрики J (сумма квадратов расстояний)&lt;br /&gt;
# Расчет нового центроида&lt;br /&gt;
# Сравнение новой метрики со старой&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность второго яруса информационного графа составляет &amp;lt;math&amp;gt;3N - 1&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* Сложность третьего яруса - &amp;lt;math&amp;gt;n * k - 1&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* Сложность четвертого яруса - &amp;lt;math&amp;gt;(max(cluster size) - 1) * N + N = N * max(cluster size)&amp;lt;/math&amp;gt;, где максимальный размер кластера зависит от входных данных, но на каждой итерации не больше &amp;lt;math&amp;gt;n - k + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итого сложность при максимальной параллелизации: &amp;lt;math&amp;gt;I * (3N - 1 + n * k - 1 + (n - k + 1) * N) = I * (4N - 2 + nk + nN - kN)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(n(k+N)I)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные параметры:&#039;&#039;&#039; &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;k&amp;lt;/math&amp;gt; - число кластеров&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;O(N * n * k)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; k центроидов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;O(N * k)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Не гарантируется достижение глобального минимума суммарного квадратичного отклонения &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, а только одного из локальных минимумов.&lt;br /&gt;
* Результат зависит от выбора исходных центров кластеров, их оптимальный выбор неизвестен.&lt;br /&gt;
* Число кластеров надо знать заранее.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
== Литература ==&lt;br /&gt;
* MacQueen, J. B. (1967). &amp;quot;Some Methods for classification and Analysis of Multivariate Observations&amp;quot;&lt;br /&gt;
* MacKay, David (2003). &amp;quot;An Example Inference Task: Clustering&amp;quot;&lt;/div&gt;</summary>
		<author><name>Msindeeva</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:Msindeeva/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_k_%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85&amp;diff=23672</id>
		<title>Участник:Msindeeva/Алгоритм k средних</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:Msindeeva/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_k_%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85&amp;diff=23672"/>
		<updated>2017-10-30T20:18:39Z</updated>

		<summary type="html">&lt;p&gt;Msindeeva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Алгоритм k средних&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Автор статьи: Синдеева Мария, группа 416&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм k средних&#039;&#039;&#039; - это алгоритм кластерного анализа, используемый в Data Mining. Цель алгоритма - разделить &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров, в которых каждое наблюдение принадлежит к кластеру с ближайшим центром, который служит прототипом всего кластера. Эта задача является NP-сложной, но существуют эффективные эвристические алгоритмы, быстро сходящиеся к локальному минимуму. &lt;br /&gt;
&lt;br /&gt;
Алгоритм k средних является наиболее популярным методом кластеризации. Он был изобретён в 1950-х годах математиком Гуго Штейнгаузом и почти одновременно Стюартом Ллойдом.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входные параметры: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений (векторов) &amp;lt;math&amp;gt;(\mathbf x_1, \mathbf x_2, .. \mathbf x_n)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - число кластеров.&lt;br /&gt;
&lt;br /&gt;
Также входным параметром можно считать метрику для векторов, например евклидово расстояние &amp;lt;math&amp;gt;d(x, y) = \sum_{i = 1}^{l} (x_i - y_i )^2&amp;lt;/math&amp;gt; - одна из самых популярных используемых метрик. &lt;br /&gt;
&lt;br /&gt;
Формально нам необходимо найти такое разделение &amp;lt;math&amp;gt;(\mathbf x_1, \mathbf x_2, .. \mathbf x_n)&amp;lt;/math&amp;gt; на подмножества &amp;lt;math&amp;gt;G = (G_1, .. G_k)&amp;lt;/math&amp;gt;, так чтобы минимизировать сумму квадратов расстояний до их центров, или суммарное квадратичное отклонение:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
F = \underset{\mathbf{G}} {\operatorname{arg\,min}}  \sum_{i=1}^{k} \sum_{\mathbf x \in G_i} d(\mathbf x, \boldsymbol\mu_i)^2,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\boldsymbol\mu_i&amp;lt;/math&amp;gt; - центр кластера &amp;lt;math&amp;gt;G_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм работает итерационно, каждая итерация алгоритма представляет собой следующее:&lt;br /&gt;
&lt;br /&gt;
* Пересчитать центр масс для каждого кластера, полученного на предыдущем шаге: &amp;lt;math&amp;gt;\boldsymbol \mu_i = \frac{\sum_{\mathbf x_i \in G_i}\mathbf x_i}{|G_i|}, i = 1, 2, .. k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Переразбить векторы на кластеры в соответствии с расстоянием до новых посчитанных центров: &amp;lt;math&amp;gt;z_i = \underset{\mathbf{j}} {\operatorname{arg\,min}} \{d(\mathbf x_i, \boldsymbol \mu_j)\}, i = 1, 2, .. n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм завершается, когда на какой-то итерации не происходит изменения центра масс кластеров. Это происходит за конечное число итераций, так как количество возможных разбиений конечного множества конечно, а на каждом шаге суммарное квадратичное отклонение F не увеличивается, поэтому зацикливание невозможно.&lt;br /&gt;
&lt;br /&gt;
Такой алгоритм сходится при любом начальном приближении разбиения на кластеры, поэтому в качестве нулевого шага часто выбирают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; случайных векторов среди  &amp;lt;math&amp;gt;(\mathbf x_1, \mathbf x_2, .. \mathbf x_n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
== Литература ==&lt;br /&gt;
* MacQueen, J. B. (1967). &amp;quot;Some Methods for classification and Analysis of Multivariate Observations&amp;quot;&lt;br /&gt;
* MacKay, David (2003). &amp;quot;An Example Inference Task: Clustering&amp;quot;&lt;/div&gt;</summary>
		<author><name>Msindeeva</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:Msindeeva/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_k_%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85&amp;diff=23671</id>
		<title>Участник:Msindeeva/Алгоритм k средних</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:Msindeeva/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_k_%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85&amp;diff=23671"/>
		<updated>2017-10-30T20:17:37Z</updated>

		<summary type="html">&lt;p&gt;Msindeeva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Алгоритм k средних &lt;br /&gt;
Автор статьи: Синдеева Мария, группа 416&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм k средних&#039;&#039;&#039; - это алгоритм кластерного анализа, используемый в Data Mining. Цель алгоритма - разделить &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров, в которых каждое наблюдение принадлежит к кластеру с ближайшим центром, который служит прототипом всего кластера. Эта задача является NP-сложной, но существуют эффективные эвристические алгоритмы, быстро сходящиеся к локальному минимуму. &lt;br /&gt;
&lt;br /&gt;
Алгоритм k средних является наиболее популярным методом кластеризации. Он был изобретён в 1950-х годах математиком Гуго Штейнгаузом и почти одновременно Стюартом Ллойдом.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входные параметры: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений (векторов) &amp;lt;math&amp;gt;(\mathbf x_1, \mathbf x_2, .. \mathbf x_n)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - число кластеров.&lt;br /&gt;
&lt;br /&gt;
Также входным параметром можно считать метрику для векторов, например евклидово расстояние &amp;lt;math&amp;gt;d(x, y) = \sum_{i = 1}^{l} (x_i - y_i )^2&amp;lt;/math&amp;gt; - одна из самых популярных используемых метрик. &lt;br /&gt;
&lt;br /&gt;
Формально нам необходимо найти такое разделение &amp;lt;math&amp;gt;(\mathbf x_1, \mathbf x_2, .. \mathbf x_n)&amp;lt;/math&amp;gt; на подмножества &amp;lt;math&amp;gt;G = (G_1, .. G_k)&amp;lt;/math&amp;gt;, так чтобы минимизировать сумму квадратов расстояний до их центров, или суммарное квадратичное отклонение:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
F = \underset{\mathbf{G}} {\operatorname{arg\,min}}  \sum_{i=1}^{k} \sum_{\mathbf x \in G_i} d(\mathbf x, \boldsymbol\mu_i)^2,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\boldsymbol\mu_i&amp;lt;/math&amp;gt; - центр кластера &amp;lt;math&amp;gt;G_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм работает итерационно, каждая итерация алгоритма представляет собой следующее:&lt;br /&gt;
&lt;br /&gt;
* Пересчитать центр масс для каждого кластера, полученного на предыдущем шаге: &amp;lt;math&amp;gt;\boldsymbol \mu_i = \frac{\sum_{\mathbf x_i \in G_i}\mathbf x_i}{|G_i|}, i = 1, 2, .. k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Переразбить векторы на кластеры в соответствии с расстоянием до новых посчитанных центров: &amp;lt;math&amp;gt;z_i = \underset{\mathbf{j}} {\operatorname{arg\,min}} \{d(\mathbf x_i, \boldsymbol \mu_j)\}, i = 1, 2, .. n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм завершается, когда на какой-то итерации не происходит изменения центра масс кластеров. Это происходит за конечное число итераций, так как количество возможных разбиений конечного множества конечно, а на каждом шаге суммарное квадратичное отклонение F не увеличивается, поэтому зацикливание невозможно.&lt;br /&gt;
&lt;br /&gt;
Такой алгоритм сходится при любом начальном приближении разбиения на кластеры, поэтому в качестве нулевого шага часто выбирают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; случайных векторов среди  &amp;lt;math&amp;gt;(\mathbf x_1, \mathbf x_2, .. \mathbf x_n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
== Литература ==&lt;br /&gt;
* MacQueen, J. B. (1967). &amp;quot;Some Methods for classification and Analysis of Multivariate Observations&amp;quot;&lt;br /&gt;
* MacKay, David (2003). &amp;quot;An Example Inference Task: Clustering&amp;quot;&lt;/div&gt;</summary>
		<author><name>Msindeeva</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:Msindeeva/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_k_%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85&amp;diff=23458</id>
		<title>Участник:Msindeeva/Алгоритм k средних</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:Msindeeva/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_k_%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%85&amp;diff=23458"/>
		<updated>2017-10-23T21:00:07Z</updated>

		<summary type="html">&lt;p&gt;Msindeeva: Первый вариант статьи&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм k средних&#039;&#039;&#039; - это алгоритм кластерного анализа, используемый в дата майнинге. Цель алгоритма - разделить &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров, в которых каждое наблюдение принадлежит к кластеру с ближайшим центром, который служит прототипом всего кластера. Эта задача является NP-сложной, но существуют эффективные эвристические алгоритмы, быстро сходящиеся к локальному минимуму. &lt;br /&gt;
&lt;br /&gt;
Алгоритм k средних является наиболее популярным метод кластеризации. Он был изобретён в 1950-х годах математиком Гуго Штейнгаузом и почти одновременно Стюартом Ллойдом.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входные параметры: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений (векторов) &amp;lt;math&amp;gt;(\mathbf x_1, \mathbf x_2, .. \mathbf x_n)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - число кластеров.&lt;br /&gt;
&lt;br /&gt;
Также входным параметром можно считать метрику для векторов, например евклидово расстояние &amp;lt;math&amp;gt;d(x, y) = \sum_{i = 1}^{l} (x_i - y_i )^2&amp;lt;/math&amp;gt; - одна из самых популярных используемых метрик. &lt;br /&gt;
&lt;br /&gt;
Формально нам необходимо найти такое разделение &amp;lt;math&amp;gt;(\mathbf x_1, \mathbf x_2, .. \mathbf x_n)&amp;lt;/math&amp;gt; на подмножества &amp;lt;math&amp;gt;G = (G_1, .. G_k)&amp;lt;/math&amp;gt;, так чтобы минимизировать сумму квадратов расстояний до их центров, или суммарное квадратичное отклонение:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
F = \underset{\mathbf{G}} {\operatorname{arg\,min}}  \sum_{i=1}^{k} \sum_{\mathbf x \in G_i} d(\mathbf x, \boldsymbol\mu_i)^2,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\boldsymbol\mu_i&amp;lt;/math&amp;gt; - центр кластера &amp;lt;math&amp;gt;G_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм работает итерационно, каждая итерация алгоритма представляет собой следующее:&lt;br /&gt;
&lt;br /&gt;
* Пересчитать центр масс для каждого кластера, полученного на предыдущем шаге: &amp;lt;math&amp;gt;\boldsymbol \mu_i = \frac{\sum_{\mathbf x_i \in G_i}\mathbf x_i}{|G_i|}, i = 1, 2, .. k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Переразбить векторы на кластеры в соответствии с расстоянием до новых посчитанных центров: &amp;lt;math&amp;gt;z_i = \underset{\mathbf{j}} {\operatorname{arg\,min}} \{d(\mathbf x_i, \boldsymbol \mu_j)\}, i = 1, 2, .. n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм завершается, когда на какой-то итерации не происходит изменения центра масс кластеров. Это происходит за конечное число итераций, так как количество возможных разбиений конечного множества конечно, а на каждом шаге суммарное квадратичное отклонение F не увеличивается, поэтому зацикливание невозможно.&lt;br /&gt;
&lt;br /&gt;
Такой алгоритм сходится при любом начальном приближении разбиения на кластеры, поэтому в качестве нулевого шаге часто выбирают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; случайных векторов среди  &amp;lt;math&amp;gt;(\mathbf x_1, \mathbf x_2, .. \mathbf x_n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
== Литература ==&lt;br /&gt;
* MacQueen, J. B. (1967). &amp;quot;Some Methods for classification and Analysis of Multivariate Observations&amp;quot;&lt;br /&gt;
* MacKay, David (2003). &amp;quot;An Example Inference Task: Clustering&amp;quot;&lt;/div&gt;</summary>
		<author><name>Msindeeva</name></author>
	</entry>
</feed>