<?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=Sergey+Lavrushkin</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=Sergey+Lavrushkin"/>
	<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/Sergey_Lavrushkin"/>
	<updated>2026-10-22T23:26:59Z</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=17832</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=17832"/>
		<updated>2016-11-16T23:08:40Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Преподаватель 1|Dexter}} &lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{nk})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F http://www.machinelearning.ru/wiki/index.php?title=Кластеризация]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;x_{i} = (x_{i1}, ..., x_{iq})&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смеси гауссовых распределений в &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерном пространстве признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} }, &lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big)&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) http://www.machinelearning.ru/wiki/index.php?title=EM_алгоритм_(пример)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляются значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij}^2 = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}\sqrt{|\Sigma_j|}}\exp{\big\{-\frac{\delta_{ij}^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать. Пусть для вычисления сумм используется пирамида сдваиванием. Тогда сложность суммирования при вычислении скрытых переменных равна &amp;lt;math&amp;gt;O(\log{k})&amp;lt;/math&amp;gt;, а при обновлении вектора параметров — &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{nk})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для исследования масштабируемости EM-алгоритм кластеризации был реализован с помощью технологии MPI. Была реализована версия алгоритма с диагональными матрицами ковариации. В качестве критерия останова было выбрано достижение максимального числа итераций (соответственно, вычисление логарифмического правдоподобия на каждой итерации не проводится).&lt;br /&gt;
&lt;br /&gt;
Алгоритм параллельной реализации:&lt;br /&gt;
# Распределение элементов выборки. Процесс 0 распределяет поровну элементы выборки по остальным процессам.&lt;br /&gt;
# Инициализация параметров смеси гауссовых распределений. Процесс 0 инициализирует параметры и отправляет их остальным процессам. &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; инициализируются случайными значениями в отрезке  &amp;lt;math&amp;gt;[-1, 1]&amp;lt;/math&amp;gt;, ковариационные матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; определяются как единичные, веса &amp;lt;math&amp;gt;w_i&amp;lt;/math&amp;gt; кластеров задаются равными &amp;lt;math&amp;gt;\frac{1}{k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Выполнение E-шага и M-шага алгоритма до достижения максимального числа итераций.&lt;br /&gt;
## E-шаг. Каждый процесс вычисляет значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; по своему набору элементов выборки.&lt;br /&gt;
## M-шаг. &lt;br /&gt;
### Каждый процесс вычисляет суммы значений скрытых переменных &amp;lt;math&amp;gt;\sum_{i = 1}^{n\_proc_i}y_{ij}&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет значения &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt; по полученным суммам и отправляет их остальным процессам. Каждый процесс обновляет значения &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; по полученным значениям &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Каждый процесс вычисляет суммы &amp;lt;math&amp;gt;\sum_{i = 1}^{n\_proc_i}y_{ij}x_i&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет суммы &amp;lt;math&amp;gt;\sum_{i = 1}^{n}y_{ij}x_i&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по всем элементам выборки и отправляет их остальным процессам. С помощью полученных сумм каждый процесс вычисляет значения математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Каждый процесс вычисляет суммы &amp;lt;math&amp;gt;sum_l = \sum_{i = 1}^{n\_proc_i}y_{ij}(x_{il} - \mu_{jl}^{new})^2 \, (l = \overline{1, q})&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет суммы &amp;lt;math&amp;gt;sum_l = \sum_{i = 1}^{n}y_{ij}(x_{il} - \mu_{jl}^{new})^2 \, (l = \overline{1, q})&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по всем элементам выборки и отправляет их остальным процессам. С помощью полученных сумм каждый процесс вычисляет значения диагональных элементов матриц ковариации &amp;lt;math&amp;gt;\Sigma_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;
Распараллеливание было проведено по числу элементов выборки, поэтому и исследование масштабируемости было проведено для числа элементов выборки. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
* число процессов [8 : 128] с шагом 8;&lt;br /&gt;
* число элементов выборки [1000000 : 20000000] с шагом 1000000;&lt;br /&gt;
* размерность элементов выборки 4;&lt;br /&gt;
* число кластеров 4;&lt;br /&gt;
* число итераций 50.&lt;br /&gt;
&lt;br /&gt;
Данные, необходимые для тестирования алгоритма, генерируются в самой программе. Для того, чтобы данные были одинаковыми при каждом запуске, ядро рандомизации было зафиксировано.&lt;br /&gt;
&lt;br /&gt;
Для каждого набора параметров было проведено по 3 запуска для избежания выбросов. Для каждого запуска измерялось среднее время выполнения одной итерации алгоритма. На следующем рисунке приведен график производительности данной реализации EM-алгоритма кластеризации в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Em-performance-avg-Lavrushkin.png|thumb|1650px|center|Рисунок 8. Параллельная реализация EM-алгоритма кластеризации. Изменение производительности в зависимости от числа процессов и числа элементов выборки.]]&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм хорошо масштабируется по числу элементов выборки. По графику видно, что в целом производительность увеличивается при увеличении числа процессов. &lt;br /&gt;
&lt;br /&gt;
[https://github.com/HighVoltageRocknRoll/EM-clusterization_scalability Исследованная параллельная MPI-реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=17831</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=17831"/>
		<updated>2016-11-16T23:03:54Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Программная реализация алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Преподаватель 1|Dexter}} &lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{nk})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F http://www.machinelearning.ru/wiki/index.php?title=Кластеризация]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;x_{i} = (x_{i1}, ..., x_{iq})&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смеси гауссовых распределений в &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерном пространстве признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} }, &lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big)&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) http://www.machinelearning.ru/wiki/index.php?title=EM_алгоритм_(пример)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляются значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij}^2 = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}\sqrt{|\Sigma_j|}}\exp{\big\{-\frac{\delta_{ij}^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать. Пусть для вычисления сумм используется пирамида сдваиванием. Тогда сложность суммирования при вычислении скрытых переменных равна &amp;lt;math&amp;gt;O(\log{k})&amp;lt;/math&amp;gt;, а при обновлении вектора параметров — &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{nk})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для исследования масштабируемости EM-алгоритм кластеризации был реализован с помощью технологии MPI. Была реализована версия алгоритма с диагональными матрицами ковариации. В качестве критерия останова было выбрано достижение максимального числа итераций (соответственно, вычисление логарифмического правдоподобия на каждой итерации не проводится).&lt;br /&gt;
&lt;br /&gt;
Алгоритм параллельной реализации:&lt;br /&gt;
# Распределение элементов выборки. Процесс 0 распределяет поровну элементы выборки по остальным процессам.&lt;br /&gt;
# Инициализация параметров смеси гауссовых распределений. Процесс 0 инициализирует параметры и отправляет их остальным процессам. &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; инициализируются случайными значениями в отрезке  &amp;lt;math&amp;gt;[-1, 1]&amp;lt;/math&amp;gt;, ковариационные матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; определяются как единичные, веса &amp;lt;math&amp;gt;w_i&amp;lt;/math&amp;gt; кластеров задаются равными &amp;lt;math&amp;gt;\frac{1}{k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Выполнение E-шага и M-шага алгоритма до достижения максимального числа итераций.&lt;br /&gt;
## E-шаг. Каждый процесс вычисляет значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; по своему набору элементов выборки.&lt;br /&gt;
## M-шаг. &lt;br /&gt;
### Каждый процесс вычисляет суммы значений скрытых переменных &amp;lt;math&amp;gt;\sum_{i = 1}^{n\_proc_i}y_{ij}&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет значения &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt; по полученным суммам и отправляет их остальным процессам. Каждый процесс обновляет значения &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; по полученным значениям &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Каждый процесс вычисляет суммы &amp;lt;math&amp;gt;\sum_{i = 1}^{n\_proc_i}y_{ij}x_i&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет суммы &amp;lt;math&amp;gt;\sum_{i = 1}^{n}y_{ij}x_i&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по всем элементам выборки и отправляет их остальным процессам. С помощью полученных сумм каждый процесс вычисляет значения математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Каждый процесс вычисляет суммы &amp;lt;math&amp;gt;sum_l = \sum_{i = 1}^{n\_proc_i}y_{ij}(x_{il} - \mu_{jl}^{new})^2 \, (l = \overline{1, q})&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет суммы &amp;lt;math&amp;gt;sum_l = \sum_{i = 1}^{n}y_{ij}(x_{il} - \mu_{jl}^{new})^2 \, (l = \overline{1, q})&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по всем элементам выборки и отправляет их остальным процессам. С помощью полученных сумм каждый процесс вычисляет значения диагональных элементов матриц ковариации &amp;lt;math&amp;gt;\Sigma_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;
Распараллеливание было проведено по числу элементов выборки, поэтому и исследование масштабируемости было проведено для числа элементов выборки. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
* число процессов [8 : 128] с шагом 8;&lt;br /&gt;
* число элементов выборки [1000000 : 20000000] с шагом 1000000;&lt;br /&gt;
* размерность элементов выборки 4;&lt;br /&gt;
* число кластеров 4;&lt;br /&gt;
* число итераций 50.&lt;br /&gt;
&lt;br /&gt;
Данные, необходимые для тестирования алгоритма, генерируются в самой программе. Для того, чтобы данные были одинаковыми при каждом запуске, ядро рандомизации было зафиксировано.&lt;br /&gt;
&lt;br /&gt;
Для каждого набора параметров было проведено по 3 запуска для избежания выбросов. Для каждого запуска измерялось среднее время выполнения одной итерации алгоритма. На следующем рисунке приведен график производительности данной реализации EM-алгоритма кластеризации в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Em-performance-Lavrushkin.png|thumb|1650px|center|Рисунок 8. Параллельная реализация EM-алгоритма кластеризации. Изменение производительности в зависимости от числа процессов и числа элементов выборки.]]&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм хорошо масштабируется по числу элементов выборки. По графику видно, что в целом производительность увеличивается при увеличении числа процессов. &lt;br /&gt;
&lt;br /&gt;
[https://github.com/HighVoltageRocknRoll/EM-clusterization_scalability Исследованная параллельная MPI-реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Em-performance-Lavrushkin.png&amp;diff=17830</id>
		<title>Файл:Em-performance-Lavrushkin.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Em-performance-Lavrushkin.png&amp;diff=17830"/>
		<updated>2016-11-16T23:02:49Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: Sergey Lavrushkin загрузил новую версию Файл:Em-performance-Lavrushkin.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16486</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16486"/>
		<updated>2016-11-11T22:41:24Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{nk})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F http://www.machinelearning.ru/wiki/index.php?title=Кластеризация]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;x_{i} = (x_{i1}, ..., x_{iq})&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смеси гауссовых распределений в &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерном пространстве признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} }, &lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big)&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) http://www.machinelearning.ru/wiki/index.php?title=EM_алгоритм_(пример)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляются значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij}^2 = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}\sqrt{|\Sigma_j|}}\exp{\big\{-\frac{\delta_{ij}^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать. Пусть для вычисления сумм используется пирамида сдваиванием. Тогда сложность суммирования при вычислении скрытых переменных равна &amp;lt;math&amp;gt;O(\log{k})&amp;lt;/math&amp;gt;, а при обновлении вектора параметров — &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{nk})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Для исследования масштабируемости EM-алгоритм кластеризации был реализован с помощью технологии MPI. Была реализована версия алгоритма с диагональными матрицами ковариации. В качестве критерия останова было выбрано достижение максимального числа итераций (соответственно, вычисление логарифмического правдоподобия на каждой итерации не проводится).&lt;br /&gt;
&lt;br /&gt;
Алгоритм параллельной реализации:&lt;br /&gt;
# Распределение элементов выборки. Процесс 0 распределяет поровну элементы выборки по остальным процессам.&lt;br /&gt;
# Инициализация параметров смеси гауссовых распределений. Процесс 0 инициализирует параметры и отправляет их остальным процессам. &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; инициализируются случайными значениями в отрезке  &amp;lt;math&amp;gt;[-1, 1]&amp;lt;/math&amp;gt;, ковариационные матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; определяются как единичные, веса &amp;lt;math&amp;gt;w_i&amp;lt;/math&amp;gt; кластеров задаются равными &amp;lt;math&amp;gt;\frac{1}{k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Выполнение E-шага и M-шага алгоритма до достижения максимального числа итераций.&lt;br /&gt;
## E-шаг. Каждый процесс вычисляет значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; по своему набору элементов выборки.&lt;br /&gt;
## M-шаг. &lt;br /&gt;
### Каждый процесс вычисляет суммы значений скрытых переменных &amp;lt;math&amp;gt;\sum_{i = 1}^{n\_proc_i}y_{ij}&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет значения &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt; по полученным суммам и отправляет их остальным процессам. Каждый процесс обновляет значения &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; по полученным значениям &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Каждый процесс вычисляет суммы &amp;lt;math&amp;gt;\sum_{i = 1}^{n\_proc_i}y_{ij}x_i&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет суммы &amp;lt;math&amp;gt;\sum_{i = 1}^{n}y_{ij}x_i&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по всем элементам выборки и отправляет их остальным процессам. С помощью полученных сумм каждый процесс вычисляет значения математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Каждый процесс вычисляет суммы &amp;lt;math&amp;gt;sum_l = \sum_{i = 1}^{n\_proc_i}y_{ij}(x_{il} - \mu_{jl}^{new})^2 \, (l = \overline{1, q})&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет суммы &amp;lt;math&amp;gt;sum_l = \sum_{i = 1}^{n}y_{ij}(x_{il} - \mu_{jl}^{new})^2 \, (l = \overline{1, q})&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по всем элементам выборки и отправляет их остальным процессам. С помощью полученных сумм каждый процесс вычисляет значения диагональных элементов матриц ковариации &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Распараллеливание было проведено по числу элементов выборки, поэтому и исследование масштабируемости было проведено для числа элементов выборки. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
* число процессов [8 : 128] с шагом 8;&lt;br /&gt;
* число элементов выборки [1000000 : 20000000] с шагом 1000000;&lt;br /&gt;
* размерность элементов выборки 4;&lt;br /&gt;
* число кластеров 4;&lt;br /&gt;
* число итераций 50.&lt;br /&gt;
&lt;br /&gt;
Для каждого набора параметров измерялось среднее время выполнения одной итерации алгоритма. На следующем рисунке приведен график производительности данной реализации EM-алгоритма кластеризации в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Em-performance-Lavrushkin.png|thumb|1650px|center|Рисунок 8. Параллельная реализация EM-алгоритма кластеризации. Изменение производительности в зависимости от числа процессов и числа элементов выборки.]]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/HighVoltageRocknRoll/EM-clusterization_scalability Исследованная параллельная MPI-реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16483</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16483"/>
		<updated>2016-11-11T22:38:34Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{nk})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F http://www.machinelearning.ru/wiki/index.php?title=Кластеризация]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;x_{i} = (x_{i1}, ..., x_{iq})&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смеси гауссовых распределений в &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерном пространстве признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} }, &lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big)&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) http://www.machinelearning.ru/wiki/index.php?title=EM_алгоритм_(пример)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляются значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij}^2 = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}\sqrt{|\Sigma_j|}}\exp{\big\{-\frac{\delta_{ij}^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать. Пусть для вычисления сумм используется пирамида сдваиванием. Тогда сложность суммирования при вычислении скрытых переменных равна &amp;lt;math&amp;gt;O(\log{k})&amp;lt;/math&amp;gt;, а при обновлении вектора параметров — &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{nk})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Для исследования масштабируемости EM-алгоритм кластеризации был реализован с помощью технологии MPI. Была реализована версия алгоритма с диагональными матрицами ковариации. В качестве критерия останова было выбрано достижение максимального числа итераций (соответственно, вычисление логарифмического правдоподобия на каждой итерации не проводится).&lt;br /&gt;
&lt;br /&gt;
Алгоритм параллельной реализации:&lt;br /&gt;
# Распределение элементов выборки. Процесс 0 распределяет поровну элементы выборки по остальным процессам.&lt;br /&gt;
# Инициализация параметров смеси гауссовых распределений. Процесс 0 инициализирует параметры и отправляет их остальным процессам. &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; инициализируются случайными значениями в отрезке  &amp;lt;math&amp;gt;[-1, 1]&amp;lt;/math&amp;gt;, ковариационные матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; определяются как единичные, веса &amp;lt;math&amp;gt;w_i&amp;lt;/math&amp;gt; кластеров задаются равными &amp;lt;math&amp;gt;\frac{1}{k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Выполнение E-шага и M-шага алгоритма до достижения максимального числа итераций.&lt;br /&gt;
## E-шаг. Каждый процесс вычисляет значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; по своему набору элементов выборки.&lt;br /&gt;
## M-шаг. &lt;br /&gt;
### Каждый процесс вычисляет суммы значений скрытых переменных &amp;lt;math&amp;gt;\sum_{i = 1}^{n\_proc_i}y_{ij}&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет значения &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt; по полученным суммам и отправляет их остальным процессам. Каждый процесс обновляет значения &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; по полученным значениям &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Каждый процесс вычисляет суммы &amp;lt;math&amp;gt;\sum_{i = 1}^{n\_proc_i}y_{ij}x_i&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет суммы &amp;lt;math&amp;gt;\sum_{i = 1}^{n}y_{ij}x_i&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по всем элементам выборки и отправляет их остальным процессам. С помощью полученных сумм каждый процесс вычисляет значения математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Каждый процесс вычисляет суммы &amp;lt;math&amp;gt;sum_l = \sum_{i = 1}^{n\_proc_i}y_{ij}(x_{il} - \mu_{jl}^{new})^2 \, (l = \overline{1, q})&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет суммы &amp;lt;math&amp;gt;sum_l = \sum_{i = 1}^{n}y_{ij}(x_{il} - \mu_{jl}^{new})^2 \, (l = \overline{1, q})&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по всем элементам выборки и отправляет их остальным процессам. С помощью полученных сумм каждый процесс вычисляет значения диагональных элементов матриц ковариации &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Распараллеливание было проведено по числу элементов выборки, поэтому и исследование масштабируемости было проведено для числа элементов выборки. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
* число процессов [8 : 128] с шагом 8;&lt;br /&gt;
* число элементов выборки [1000000 : 20000000] с шагом 1000000;&lt;br /&gt;
* размерность элементов выборки 4;&lt;br /&gt;
* число кластеров 4;&lt;br /&gt;
* число итераций 50.&lt;br /&gt;
&lt;br /&gt;
Для каждого набора параметров измерялось среднее время выполнения одной итерации алгоритма. На следующем рисунке приведен график производительности данной реализации EM-алгоритма кластеризации в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Em-performance-Lavrushkin.png|thumb|1650px|center|Рисунок 8. Параллельная реализация EM-алгоритма кластеризации. Изменение производительности в зависимости от числа процессов и числа элементов выборки.]]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/HighVoltageRocknRoll/EM-clusterization_scalability Исследованная параллельная MPI-реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16482</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16482"/>
		<updated>2016-11-11T22:35:52Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{nk})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F http://www.machinelearning.ru/wiki/index.php?title=Кластеризация]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;x_{i} = (x_{i1}, ..., x_{iq})&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смеси гауссовых распределений в &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерном пространстве признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} }, &lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big)&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) http://www.machinelearning.ru/wiki/index.php?title=EM_алгоритм_(пример)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляются значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij}^2 = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}\sqrt{|\Sigma_j|}}\exp{\big\{-\frac{\delta_{ij}^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать. Пусть для вычисления сумм используется пирамида сдваиванием. Тогда сложность суммирования при вычислении скрытых переменных равна &amp;lt;math&amp;gt;O(\log{k})&amp;lt;/math&amp;gt;, а при обновлении вектора параметров — &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{nk})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Для исследования масштабируемости EM-алгоритм кластеризации был реализован с помощью технологии MPI. Была реализована версия алгоритма с диагональными матрицами ковариации. В качестве критерия останова было выбрано достижение максимального числа итераций (соответственно, вычисление логарифмического правдоподобия на каждой итерации не проводится).&lt;br /&gt;
&lt;br /&gt;
Алгоритм параллельной реализации:&lt;br /&gt;
# Распределение элементов выборки. Процесс 0 распределяет поровну элементы выборки по остальным процессам.&lt;br /&gt;
# Инициализация параметров смеси гауссовых распределений. Процесс 0 инициализирует параметры и отправляет их остальным процессам. &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; инициализируются случайными значениями в отрезке  &amp;lt;math&amp;gt;[-1, 1]&amp;lt;/math&amp;gt;, ковариационные матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; определяются как единичные, веса &amp;lt;math&amp;gt;w_i&amp;lt;/math&amp;gt; кластеров задаются равными &amp;lt;math&amp;gt;\frac{1}{k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Выполнение E-шага и M-шага алгоритма до достижения максимального числа итераций.&lt;br /&gt;
## E-шаг. Каждый процесс вычисляет значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; по своему набору элементов выборки.&lt;br /&gt;
## M-шаг. &lt;br /&gt;
### Каждый процесс вычисляет суммы значений скрытых переменных &amp;lt;math&amp;gt;\sum_{i = 1}^{n\_proc_i}y_{ij}&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет значения &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt; по полученным суммам и отправляет их остальным процессам. Каждый процесс обновляет значения &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; по полученным значениям &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Каждый процесс вычисляет суммы &amp;lt;math&amp;gt;\sum_{i = 1}^{n\_proc_i}y_{ij}x_i&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет суммы &amp;lt;math&amp;gt;&amp;gt;\sum_{i = 1}^{n}y_{ij}x_i&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по всем элементам выборки и отправляет их остальным процессам. С помощью полученных сумм каждый процесс вычисляет значения математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Каждый процесс вычисляет суммы &amp;lt;math&amp;gt;sum_l = \sum_{i = 1}^{n\_proc_i}y_{ij}(x_{il} - \mu_{jl}^{new})^2 \, (l = \overline{1, q})&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет суммы &amp;lt;math&amp;gt;sum_l = \sum_{i = 1}^{n}y_{ij}(x_{il} - \mu_{jl}^{new})^2 \, (l = \overline{1, q})&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по всем элементам выборки и отправляет их остальным процессам. С помощью полученных сумм каждый процесс вычисляет значения диагональных элементов матриц ковариации &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Распараллеливание было проведено по числу элементов выборки, поэтому и исследование масштабируемости было проведено для числа элементов выборки. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
* число процессов [8 : 128] с шагом 8;&lt;br /&gt;
* число элементов выборки [1000000 : 20000000] с шагом 1000000;&lt;br /&gt;
* размерность элементов выборки 4;&lt;br /&gt;
* число кластеров 4;&lt;br /&gt;
* число итераций 50.&lt;br /&gt;
&lt;br /&gt;
Для каждого набора параметров измерялось среднее время выполнения одной итерации алгоритма. На следующем рисунке приведен график производительности данной реализации EM-алгоритма кластеризации в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Em-performance-Lavrushkin.png|thumb|1650px|center|Рисунок 8. Параллельная реализация EM-алгоритма кластеризации. Изменение производительности в зависимости от числа процессов и числа элементов выборки.]]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/HighVoltageRocknRoll/EM-clusterization_scalability Исследованная параллельная MPI-реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16480</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16480"/>
		<updated>2016-11-11T22:35:29Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{nk})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F http://www.machinelearning.ru/wiki/index.php?title=Кластеризация]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;x_{i} = (x_{i1}, ..., x_{iq})&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смеси гауссовых распределений в &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерном пространстве признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} }, &lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big)&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) http://www.machinelearning.ru/wiki/index.php?title=EM_алгоритм_(пример)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляются значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij}^2 = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}\sqrt{|\Sigma_j|}}\exp{\big\{-\frac{\delta_{ij}^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать. Пусть для вычисления сумм используется пирамида сдваиванием. Тогда сложность суммирования при вычислении скрытых переменных равна &amp;lt;math&amp;gt;O(\log{k})&amp;lt;/math&amp;gt;, а при обновлении вектора параметров — &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{nk})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Для исследования масштабируемости EM-алгоритм кластеризации был реализован с помощью технологии MPI. Была реализована версия алгоритма с диагональными матрицами ковариации. В качестве критерия останова было выбрано достижение максимального числа итераций (соответственно, вычисление логарифмического правдоподобия на каждой итерации не проводится).&lt;br /&gt;
&lt;br /&gt;
Алгоритм параллельной реализации:&lt;br /&gt;
# Распределение элементов выборки. Процесс 0 распределяет поровну элементы выборки по остальным процессам.&lt;br /&gt;
# Инициализация параметров смеси гауссовых распределений. Процесс 0 инициализирует параметры и отправляет их остальным процессам. &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; инициализируются случайными значениями в отрезке  &amp;lt;math&amp;gt;[-1, 1]&amp;lt;/math&amp;gt;, ковариационные матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; определяются как единичные, веса &amp;lt;math&amp;gt;w_i&amp;lt;/math&amp;gt; кластеров задаются равными &amp;lt;math&amp;gt;\frac{1}{k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Выполнение E-шага и M-шага алгоритма до достижения максимального числа итераций.&lt;br /&gt;
## E-шаг. Каждый процесс вычисляет значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; по своему набору элементов выборки.&lt;br /&gt;
## M-шаг. &lt;br /&gt;
### Каждый процесс вычисляет суммы значений скрытых переменных &amp;lt;math&amp;gt;\sum_{i = 1}^{n\_proc_i}y_{ij}&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет значения &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt; по полученным суммам и отправляет их остальным процессам. Каждый процесс обновляет значения &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; по полученным значениям &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Каждый процесс вычисляет суммы &amp;lt;math&amp;gt;\sum_{i = 1}^{n\_proc_i}y_{ij}x_i&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет суммы &amp;lt;math&amp;gt;&amp;gt;\sum_{i = 1}^{n}y_{ij}x_i&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по всем элементам выборки и отправляет их остальным процессам. С помощью полученных сумм каждый процесс вычисляет значения математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Каждый процесс вычисляет суммы &amp;lt;math&amp;gt;sum_l = \sum_{i = 1}^{n\_proc_i}y_{ij}(x_{il} - \mu_{jl}^{new})^2 \, (l = \overline{1, q})&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет суммы &amp;lt;math&amp;gt;sum_l = \sum_{i = 1}^{n}y_{ij}(x_{il} - \mu_{jl}^{new})^2 \, (l = \overline{1, q})&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по всем элементам выборки и отправляет их остальным процессам. С помощью полученных сумм каждый процесс вычисляет значения диагональных элементов матриц ковариации &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Распараллеливание было проведено по числу элементов выборки, поэтому и исследование масштабируемости было проведено для числа элементов выборки. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
* число процессов [8 : 128] с шагом 8;&lt;br /&gt;
* число элементов выборки [1000000 : 20000000] с шагом 1000000;&lt;br /&gt;
* размерность элементов выборки 4;&lt;br /&gt;
* число кластеров 4;&lt;br /&gt;
* число итераций 50.&lt;br /&gt;
&lt;br /&gt;
Для каждого набора параметров измерялось среднее время выполнения одной итерации алгоритма. На следующем рисунке приведен график производительности данной реализации EM-алгоритма кластеризации в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Em-performance-Lavrushkin.png|thumb|1700px|center|Рисунок 8. Параллельная реализация EM-алгоритма кластеризации. Изменение производительности в зависимости от числа процессов и числа элементов выборки.]]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/HighVoltageRocknRoll/EM-clusterization_scalability Исследованная параллельная MPI-реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16479</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16479"/>
		<updated>2016-11-11T22:35:07Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{nk})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F http://www.machinelearning.ru/wiki/index.php?title=Кластеризация]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;x_{i} = (x_{i1}, ..., x_{iq})&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смеси гауссовых распределений в &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерном пространстве признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} }, &lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big)&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) http://www.machinelearning.ru/wiki/index.php?title=EM_алгоритм_(пример)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляются значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij}^2 = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}\sqrt{|\Sigma_j|}}\exp{\big\{-\frac{\delta_{ij}^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать. Пусть для вычисления сумм используется пирамида сдваиванием. Тогда сложность суммирования при вычислении скрытых переменных равна &amp;lt;math&amp;gt;O(\log{k})&amp;lt;/math&amp;gt;, а при обновлении вектора параметров — &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{nk})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Для исследования масштабируемости EM-алгоритм кластеризации был реализован с помощью технологии MPI. Была реализована версия алгоритма с диагональными матрицами ковариации. В качестве критерия останова было выбрано достижение максимального числа итераций (соответственно, вычисление логарифмического правдоподобия на каждой итерации не проводится).&lt;br /&gt;
&lt;br /&gt;
Алгоритм параллельной реализации:&lt;br /&gt;
# Распределение элементов выборки. Процесс 0 распределяет поровну элементы выборки по остальным процессам.&lt;br /&gt;
# Инициализация параметров смеси гауссовых распределений. Процесс 0 инициализирует параметры и отправляет их остальным процессам. &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; инициализируются случайными значениями в отрезке  &amp;lt;math&amp;gt;[-1, 1]&amp;lt;/math&amp;gt;, ковариационные матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; определяются как единичные, веса &amp;lt;math&amp;gt;w_i&amp;lt;/math&amp;gt; кластеров задаются равными &amp;lt;math&amp;gt;\frac{1}{k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Выполнение E-шага и M-шага алгоритма до достижения максимального числа итераций.&lt;br /&gt;
## E-шаг. Каждый процесс вычисляет значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; по своему набору элементов выборки.&lt;br /&gt;
## M-шаг. &lt;br /&gt;
### Каждый процесс вычисляет суммы значений скрытых переменных &amp;lt;math&amp;gt;\sum_{i = 1}^{n\_proc_i}y_{ij}&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет значения &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt; по полученным суммам и отправляет их остальным процессам. Каждый процесс обновляет значения &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; по полученным значениям &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Каждый процесс вычисляет суммы &amp;lt;math&amp;gt;\sum_{i = 1}^{n\_proc_i}y_{ij}x_i&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет суммы &amp;lt;math&amp;gt;&amp;gt;\sum_{i = 1}^{n}y_{ij}x_i&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по всем элементам выборки и отправляет их остальным процессам. С помощью полученных сумм каждый процесс вычисляет значения математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Каждый процесс вычисляет суммы &amp;lt;math&amp;gt;sum_l = \sum_{i = 1}^{n\_proc_i}y_{ij}(x_{il} - \mu_{jl}^{new})^2 \, (l = \overline{1, q})&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет суммы &amp;lt;math&amp;gt;sum_l = \sum_{i = 1}^{n}y_{ij}(x_{il} - \mu_{jl}^{new})^2 \, (l = \overline{1, q})&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по всем элементам выборки и отправляет их остальным процессам. С помощью полученных сумм каждый процесс вычисляет значения диагональных элементов матриц ковариации &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Распараллеливание было проведено по числу элементов выборки, поэтому и исследование масштабируемости было проведено для числа элементов выборки. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
* число процессов [8 : 128] с шагом 8;&lt;br /&gt;
* число элементов выборки [1000000 : 20000000] с шагом 1000000;&lt;br /&gt;
* размерность элементов выборки 4;&lt;br /&gt;
* число кластеров 4;&lt;br /&gt;
* число итераций 50.&lt;br /&gt;
&lt;br /&gt;
Для каждого набора параметров измерялось среднее время выполнения одной итерации алгоритма. На следующем рисунке приведен график производительности данной реализации EM-алгоритма кластеризации в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Em-performance-Lavrushkin.png|thumb|1800px|center|Рисунок 8. Параллельная реализация EM-алгоритма кластеризации. Изменение производительности в зависимости от числа процессов и числа элементов выборки.]]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/HighVoltageRocknRoll/EM-clusterization_scalability Исследованная параллельная MPI-реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16478</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16478"/>
		<updated>2016-11-11T22:34:26Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{nk})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F http://www.machinelearning.ru/wiki/index.php?title=Кластеризация]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;x_{i} = (x_{i1}, ..., x_{iq})&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смеси гауссовых распределений в &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерном пространстве признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} }, &lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big)&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) http://www.machinelearning.ru/wiki/index.php?title=EM_алгоритм_(пример)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляются значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij}^2 = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}\sqrt{|\Sigma_j|}}\exp{\big\{-\frac{\delta_{ij}^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать. Пусть для вычисления сумм используется пирамида сдваиванием. Тогда сложность суммирования при вычислении скрытых переменных равна &amp;lt;math&amp;gt;O(\log{k})&amp;lt;/math&amp;gt;, а при обновлении вектора параметров — &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{nk})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Для исследования масштабируемости EM-алгоритм кластеризации был реализован с помощью технологии MPI. Была реализована версия алгоритма с диагональными матрицами ковариации. В качестве критерия останова было выбрано достижение максимального числа итераций (соответственно, вычисление логарифмического правдоподобия на каждой итерации не проводится).&lt;br /&gt;
&lt;br /&gt;
Алгоритм параллельной реализации:&lt;br /&gt;
# Распределение элементов выборки. Процесс 0 распределяет поровну элементы выборки по остальным процессам.&lt;br /&gt;
# Инициализация параметров смеси гауссовых распределений. Процесс 0 инициализирует параметры и отправляет их остальным процессам. &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; инициализируются случайными значениями в отрезке  &amp;lt;math&amp;gt;[-1, 1]&amp;lt;/math&amp;gt;, ковариационные матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; определяются как единичные, веса &amp;lt;math&amp;gt;w_i&amp;lt;/math&amp;gt; кластеров задаются равными &amp;lt;math&amp;gt;\frac{1}{k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Выполнение E-шага и M-шага алгоритма до достижения максимального числа итераций.&lt;br /&gt;
## E-шаг. Каждый процесс вычисляет значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; по своему набору элементов выборки.&lt;br /&gt;
## M-шаг. &lt;br /&gt;
### Каждый процесс вычисляет суммы значений скрытых переменных &amp;lt;math&amp;gt;\sum_{i = 1}^{n\_proc_i}y_{ij}&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет значения &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt; по полученным суммам и отправляет их остальным процессам. Каждый процесс обновляет значения &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; по полученным значениям &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Каждый процесс вычисляет суммы &amp;lt;math&amp;gt;\sum_{i = 1}^{n\_proc_i}y_{ij}x_i&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет суммы &amp;lt;math&amp;gt;&amp;gt;\sum_{i = 1}^{n}y_{ij}x_i&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по всем элементам выборки и отправляет их остальным процессам. С помощью полученных сумм каждый процесс вычисляет значения математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Каждый процесс вычисляет суммы &amp;lt;math&amp;gt;sum_l = \sum_{i = 1}^{n\_proc_i}y_{ij}(x_{il} - \mu_{jl}^{new})^2 \, (l = \overline{1, q})&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет суммы &amp;lt;math&amp;gt;sum_l = \sum_{i = 1}^{n}y_{ij}(x_{il} - \mu_{jl}^{new})^2 \, (l = \overline{1, q})&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по всем элементам выборки и отправляет их остальным процессам. С помощью полученных сумм каждый процесс вычисляет значения диагональных элементов матриц ковариации &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Распараллеливание было проведено по числу элементов выборки, поэтому и исследование масштабируемости было проведено для числа элементов выборки. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
* число процессов [8 : 128] с шагом 8;&lt;br /&gt;
* число элементов выборки [1000000 : 20000000] с шагом 1000000;&lt;br /&gt;
* размерность элементов выборки 4;&lt;br /&gt;
* число кластеров 4;&lt;br /&gt;
* число итераций 50.&lt;br /&gt;
&lt;br /&gt;
Для каждого набора параметров измерялось среднее время выполнения одной итерации алгоритма. На следующем рисунке приведен график производительности данной реализации EM-алгоритма кластеризации в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Em-performance-Lavrushkin.png|thumb|2000px|center|Рисунок 8. Параллельная реализация EM-алгоритма кластеризации. Изменение производительности в зависимости от числа процессов и числа элементов выборки.]]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/HighVoltageRocknRoll/EM-clusterization_scalability Исследованная параллельная MPI-реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16477</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16477"/>
		<updated>2016-11-11T22:34:03Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{nk})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F http://www.machinelearning.ru/wiki/index.php?title=Кластеризация]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;x_{i} = (x_{i1}, ..., x_{iq})&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смеси гауссовых распределений в &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерном пространстве признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} }, &lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big)&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) http://www.machinelearning.ru/wiki/index.php?title=EM_алгоритм_(пример)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляются значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij}^2 = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}\sqrt{|\Sigma_j|}}\exp{\big\{-\frac{\delta_{ij}^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать. Пусть для вычисления сумм используется пирамида сдваиванием. Тогда сложность суммирования при вычислении скрытых переменных равна &amp;lt;math&amp;gt;O(\log{k})&amp;lt;/math&amp;gt;, а при обновлении вектора параметров — &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{nk})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Для исследования масштабируемости EM-алгоритм кластеризации был реализован с помощью технологии MPI. Была реализована версия алгоритма с диагональными матрицами ковариации. В качестве критерия останова было выбрано достижение максимального числа итераций (соответственно, вычисление логарифмического правдоподобия на каждой итерации не проводится).&lt;br /&gt;
&lt;br /&gt;
Алгоритм параллельной реализации:&lt;br /&gt;
# Распределение элементов выборки. Процесс 0 распределяет поровну элементы выборки по остальным процессам.&lt;br /&gt;
# Инициализация параметров смеси гауссовых распределений. Процесс 0 инициализирует параметры и отправляет их остальным процессам. &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; инициализируются случайными значениями в отрезке  &amp;lt;math&amp;gt;[-1, 1]&amp;lt;/math&amp;gt;, ковариационные матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; определяются как единичные, веса &amp;lt;math&amp;gt;w_i&amp;lt;/math&amp;gt; кластеров задаются равными &amp;lt;math&amp;gt;\frac{1}{k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Выполнение E-шага и M-шага алгоритма до достижения максимального числа итераций.&lt;br /&gt;
## E-шаг. Каждый процесс вычисляет значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; по своему набору элементов выборки.&lt;br /&gt;
## M-шаг. &lt;br /&gt;
### Каждый процесс вычисляет суммы значений скрытых переменных &amp;lt;math&amp;gt;\sum_{i = 1}^{n\_proc_i}y_{ij}&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет значения &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt; по полученным суммам и отправляет их остальным процессам. Каждый процесс обновляет значения &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; по полученным значениям &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Каждый процесс вычисляет суммы &amp;lt;math&amp;gt;\sum_{i = 1}^{n\_proc_i}y_{ij}x_i&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет суммы &amp;lt;math&amp;gt;&amp;gt;\sum_{i = 1}^{n}y_{ij}x_i&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по всем элементам выборки и отправляет их остальным процессам. С помощью полученных сумм каждый процесс вычисляет значения математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Каждый процесс вычисляет суммы &amp;lt;math&amp;gt;sum_l = \sum_{i = 1}^{n\_proc_i}y_{ij}(x_{il} - \mu_{jl}^{new})^2 \, (l = \overline{1, q})&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет суммы &amp;lt;math&amp;gt;sum_l = \sum_{i = 1}^{n}y_{ij}(x_{il} - \mu_{jl}^{new})^2 \, (l = \overline{1, q})&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по всем элементам выборки и отправляет их остальным процессам. С помощью полученных сумм каждый процесс вычисляет значения диагональных элементов матриц ковариации &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Распараллеливание было проведено по числу элементов выборки, поэтому и исследование масштабируемости было проведено для числа элементов выборки. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
* число процессов [8 : 128] с шагом 8;&lt;br /&gt;
* число элементов выборки [1000000 : 20000000] с шагом 1000000;&lt;br /&gt;
* размерность элементов выборки 4;&lt;br /&gt;
* число кластеров 4;&lt;br /&gt;
* число итераций 50.&lt;br /&gt;
&lt;br /&gt;
Для каждого набора параметров измерялось среднее время выполнения одной итерации алгоритма. На следующем рисунке приведен график производительности данной реализации EM-алгоритма кластеризации в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Em-performance-Lavrushkin.png|thumb|1600px|center|Рисунок 8. Параллельная реализация EM-алгоритма кластеризации. Изменение производительности в зависимости от числа процессов и числа элементов выборки.]]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/HighVoltageRocknRoll/EM-clusterization_scalability Исследованная параллельная MPI-реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16476</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16476"/>
		<updated>2016-11-11T22:33:47Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{nk})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F http://www.machinelearning.ru/wiki/index.php?title=Кластеризация]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;x_{i} = (x_{i1}, ..., x_{iq})&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смеси гауссовых распределений в &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерном пространстве признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} }, &lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big)&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) http://www.machinelearning.ru/wiki/index.php?title=EM_алгоритм_(пример)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляются значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij}^2 = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}\sqrt{|\Sigma_j|}}\exp{\big\{-\frac{\delta_{ij}^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать. Пусть для вычисления сумм используется пирамида сдваиванием. Тогда сложность суммирования при вычислении скрытых переменных равна &amp;lt;math&amp;gt;O(\log{k})&amp;lt;/math&amp;gt;, а при обновлении вектора параметров — &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{nk})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Для исследования масштабируемости EM-алгоритм кластеризации был реализован с помощью технологии MPI. Была реализована версия алгоритма с диагональными матрицами ковариации. В качестве критерия останова было выбрано достижение максимального числа итераций (соответственно, вычисление логарифмического правдоподобия на каждой итерации не проводится).&lt;br /&gt;
&lt;br /&gt;
Алгоритм параллельной реализации:&lt;br /&gt;
# Распределение элементов выборки. Процесс 0 распределяет поровну элементы выборки по остальным процессам.&lt;br /&gt;
# Инициализация параметров смеси гауссовых распределений. Процесс 0 инициализирует параметры и отправляет их остальным процессам. &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; инициализируются случайными значениями в отрезке  &amp;lt;math&amp;gt;[-1, 1]&amp;lt;/math&amp;gt;, ковариационные матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; определяются как единичные, веса &amp;lt;math&amp;gt;w_i&amp;lt;/math&amp;gt; кластеров задаются равными &amp;lt;math&amp;gt;\frac{1}{k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Выполнение E-шага и M-шага алгоритма до достижения максимального числа итераций.&lt;br /&gt;
## E-шаг. Каждый процесс вычисляет значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; по своему набору элементов выборки.&lt;br /&gt;
## M-шаг. &lt;br /&gt;
### Каждый процесс вычисляет суммы значений скрытых переменных &amp;lt;math&amp;gt;\sum_{i = 1}^{n\_proc_i}y_{ij}&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет значения &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt; по полученным суммам и отправляет их остальным процессам. Каждый процесс обновляет значения &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; по полученным значениям &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Каждый процесс вычисляет суммы &amp;lt;math&amp;gt;\sum_{i = 1}^{n\_proc_i}y_{ij}x_i&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет суммы &amp;lt;math&amp;gt;&amp;gt;\sum_{i = 1}^{n}y_{ij}x_i&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по всем элементам выборки и отправляет их остальным процессам. С помощью полученных сумм каждый процесс вычисляет значения математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Каждый процесс вычисляет суммы &amp;lt;math&amp;gt;sum_l = \sum_{i = 1}^{n\_proc_i}y_{ij}(x_{il} - \mu_{jl}^{new})^2 \, (l = \overline{1, q})&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет суммы &amp;lt;math&amp;gt;sum_l = \sum_{i = 1}^{n}y_{ij}(x_{il} - \mu_{jl}^{new})^2 \, (l = \overline{1, q})&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по всем элементам выборки и отправляет их остальным процессам. С помощью полученных сумм каждый процесс вычисляет значения диагональных элементов матриц ковариации &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Распараллеливание было проведено по числу элементов выборки, поэтому и исследование масштабируемости было проведено для числа элементов выборки. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
* число процессов [8 : 128] с шагом 8;&lt;br /&gt;
* число элементов выборки [1000000 : 20000000] с шагом 1000000;&lt;br /&gt;
* размерность элементов выборки 4;&lt;br /&gt;
* число кластеров 4;&lt;br /&gt;
* число итераций 50.&lt;br /&gt;
&lt;br /&gt;
Для каждого набора параметров измерялось среднее время выполнения одной итерации алгоритма. На следующем рисунке приведен график производительности данной реализации EM-алгоритма кластеризации в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Em-performance-Lavrushkin.png|thumb|1000px|center|Рисунок 8. Параллельная реализация EM-алгоритма кластеризации. Изменение производительности в зависимости от числа процессов и числа элементов выборки.]]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/HighVoltageRocknRoll/EM-clusterization_scalability Исследованная параллельная MPI-реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16475</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16475"/>
		<updated>2016-11-11T22:32:46Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{nk})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F http://www.machinelearning.ru/wiki/index.php?title=Кластеризация]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;x_{i} = (x_{i1}, ..., x_{iq})&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смеси гауссовых распределений в &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерном пространстве признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} }, &lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big)&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) http://www.machinelearning.ru/wiki/index.php?title=EM_алгоритм_(пример)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляются значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij}^2 = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}\sqrt{|\Sigma_j|}}\exp{\big\{-\frac{\delta_{ij}^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать. Пусть для вычисления сумм используется пирамида сдваиванием. Тогда сложность суммирования при вычислении скрытых переменных равна &amp;lt;math&amp;gt;O(\log{k})&amp;lt;/math&amp;gt;, а при обновлении вектора параметров — &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{nk})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Для исследования масштабируемости EM-алгоритм кластеризации был реализован с помощью технологии MPI. Была реализована версия алгоритма с диагональными матрицами ковариации. В качестве критерия останова было выбрано достижение максимального числа итераций (соответственно, вычисление логарифмического правдоподобия на каждой итерации не проводится).&lt;br /&gt;
&lt;br /&gt;
Алгоритм параллельной реализации:&lt;br /&gt;
# Распределение элементов выборки. Процесс 0 распределяет поровну элементы выборки по остальным процессам.&lt;br /&gt;
# Инициализация параметров смеси гауссовых распределений. Процесс 0 инициализирует параметры и отправляет их остальным процессам. &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; инициализируются случайными значениями в отрезке  &amp;lt;math&amp;gt;[-1, 1]&amp;lt;/math&amp;gt;, ковариационные матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; определяются как единичные, веса &amp;lt;math&amp;gt;w_i&amp;lt;/math&amp;gt; кластеров задаются равными &amp;lt;math&amp;gt;\frac{1}{k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Выполнение E-шага и M-шага алгоритма до достижения максимального числа итераций.&lt;br /&gt;
## E-шаг. Каждый процесс вычисляет значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; по своему набору элементов выборки.&lt;br /&gt;
## M-шаг. &lt;br /&gt;
### Каждый процесс вычисляет суммы значений скрытых переменных &amp;lt;math&amp;gt;\sum_{i = 1}^{n\_proc_i}y_{ij}&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет значения &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt; по полученным суммам и отправляет их остальным процессам. Каждый процесс обновляет значения &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; по полученным значениям &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Каждый процесс вычисляет суммы &amp;lt;math&amp;gt;\sum_{i = 1}^{n\_proc_i}y_{ij}x_i&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет суммы &amp;lt;math&amp;gt;&amp;gt;\sum_{i = 1}^{n}y_{ij}x_i&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по всем элементам выборки и отправляет их остальным процессам. С помощью полученных сумм каждый процесс вычисляет значения математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Каждый процесс вычисляет суммы &amp;lt;math&amp;gt;sum_l = \sum_{i = 1}^{n\_proc_i}y_{ij}(x_{il} - \mu_{jl}^{new})^2 \, (l = \overline{1, q})&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет суммы &amp;lt;math&amp;gt;sum_l = \sum_{i = 1}^{n}y_{ij}(x_{il} - \mu_{jl}^{new})^2 \, (l = \overline{1, q})&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по всем элементам выборки и отправляет их остальным процессам. С помощью полученных сумм каждый процесс вычисляет значения диагональных элементов матриц ковариации &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Распараллеливание было проведено по числу элементов выборки, поэтому и исследование масштабируемости было проведено для числа элементов выборки. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
* число процессов [8 : 128] с шагом 8;&lt;br /&gt;
* число элементов выборки [1000000 : 20000000] с шагом 1000000;&lt;br /&gt;
* размерность элементов выборки 4;&lt;br /&gt;
* число кластеров 4;&lt;br /&gt;
* число итераций 50.&lt;br /&gt;
&lt;br /&gt;
Для каждого набора параметров измерялось среднее время выполнения одной итерации алгоритма. На следующем рисунке приведен график производительности данной реализации EM-алгоритма кластеризации в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[Em-performance-Lavrushkin.png|thumb|1000px|center|Рисунок 8. Параллельная реализация EM-алгоритма кластеризации. Изменение производительности в зависимости от числа процессов и числа элементов выборки.]]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/HighVoltageRocknRoll/EM-clusterization_scalability Исследованная параллельная MPI-реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16473</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16473"/>
		<updated>2016-11-11T22:31:13Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{nk})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F http://www.machinelearning.ru/wiki/index.php?title=Кластеризация]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;x_{i} = (x_{i1}, ..., x_{iq})&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смеси гауссовых распределений в &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерном пространстве признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} }, &lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big)&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) http://www.machinelearning.ru/wiki/index.php?title=EM_алгоритм_(пример)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляются значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij}^2 = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}\sqrt{|\Sigma_j|}}\exp{\big\{-\frac{\delta_{ij}^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать. Пусть для вычисления сумм используется пирамида сдваиванием. Тогда сложность суммирования при вычислении скрытых переменных равна &amp;lt;math&amp;gt;O(\log{k})&amp;lt;/math&amp;gt;, а при обновлении вектора параметров — &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{nk})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Для исследования масштабируемости EM-алгоритм кластеризации был реализован с помощью технологии MPI. Была реализована версия алгоритма с диагональными матрицами ковариации. В качестве критерия останова было выбрано достижение максимального числа итераций (соответственно, вычисление логарифмического правдоподобия на каждой итерации не проводится).&lt;br /&gt;
&lt;br /&gt;
Алгоритм параллельной реализации:&lt;br /&gt;
# Распределение элементов выборки. Процесс 0 распределяет поровну элементы выборки по остальным процессам.&lt;br /&gt;
# Инициализация параметров смеси гауссовых распределений. Процесс 0 инициализирует параметры и отправляет их остальным процессам. &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; инициализируются случайными значениями в отрезке  &amp;lt;math&amp;gt;[-1, 1]&amp;lt;/math&amp;gt;, ковариационные матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; определяются как единичные, веса &amp;lt;math&amp;gt;w_i&amp;lt;/math&amp;gt; кластеров задаются равными &amp;lt;math&amp;gt;\frac{1}{k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Выполнение E-шага и M-шага алгоритма до достижения максимального числа итераций.&lt;br /&gt;
## E-шаг. Каждый процесс вычисляет значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; по своему набору элементов выборки.&lt;br /&gt;
## M-шаг. &lt;br /&gt;
### Каждый процесс вычисляет суммы значений скрытых переменных &amp;lt;math&amp;gt;\sum_{i = 1}^{n\_proc_i}y_{ij}&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет значения &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt; по полученным суммам и отправляет их остальным процессам. Каждый процесс обновляет значения &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; по полученным значениям &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Каждый процесс вычисляет суммы &amp;lt;math&amp;gt;\sum_{i = 1}^{n\_proc_i}y_{ij}x_i&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет суммы &amp;lt;math&amp;gt;&amp;gt;\sum_{i = 1}^{n}y_{ij}x_i&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по всем элементам выборки и отправляет их остальным процессам. С помощью полученных сумм каждый процесс вычисляет значения математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Каждый процесс вычисляет суммы &amp;lt;math&amp;gt;sum_l = \sum_{i = 1}^{n\_proc_i}y_{ij}(x_{il} - \mu_{jl}^{new})^2 \, (l = \overline{1, q})&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет суммы &amp;lt;math&amp;gt;sum_l = \sum_{i = 1}^{n}y_{ij}(x_{il} - \mu_{jl}^{new})^2 \, (l = \overline{1, q})&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по всем элементам выборки и отправляет их остальным процессам. С помощью полученных сумм каждый процесс вычисляет значения диагональных элементов матриц ковариации &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Распараллеливание было проведено по числу элементов выборки, поэтому и исследование масштабируемости было проведено для числа элементов выборки. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
* число процессов [8 : 128] с шагом 8;&lt;br /&gt;
* число элементов выборки [1000000 : 20000000] с шагом 1000000;&lt;br /&gt;
* размерность элементов выборки 4;&lt;br /&gt;
* число кластеров 4;&lt;br /&gt;
* число итераций 50.&lt;br /&gt;
&lt;br /&gt;
Для каждого набора параметров измерялось среднее время выполнения одной итерации алгоритма. На следующем рисунке приведен график производительности данной реализации EM-алгоритма кластеризации в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[Em-performance-Lavrushkin.png.png|thumb|1000px|center|Рисунок 8. Параллельная реализация EM-алгоритма кластеризации. Изменение производительности в зависимости от числа процессов и числа элементов выборки.]]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/HighVoltageRocknRoll/EM-clusterization_scalability Исследованная параллельная MPI-реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16472</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16472"/>
		<updated>2016-11-11T22:30:56Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{nk})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F http://www.machinelearning.ru/wiki/index.php?title=Кластеризация]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;x_{i} = (x_{i1}, ..., x_{iq})&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смеси гауссовых распределений в &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерном пространстве признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} }, &lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big)&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) http://www.machinelearning.ru/wiki/index.php?title=EM_алгоритм_(пример)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляются значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij}^2 = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}\sqrt{|\Sigma_j|}}\exp{\big\{-\frac{\delta_{ij}^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать. Пусть для вычисления сумм используется пирамида сдваиванием. Тогда сложность суммирования при вычислении скрытых переменных равна &amp;lt;math&amp;gt;O(\log{k})&amp;lt;/math&amp;gt;, а при обновлении вектора параметров — &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{nk})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Для исследования масштабируемости EM-алгоритм кластеризации был реализован с помощью технологии MPI. Была реализована версия алгоритма с диагональными матрицами ковариации. В качестве критерия останова было выбрано достижение максимального числа итераций (соответственно, вычисление логарифмического правдоподобия на каждой итерации не проводится).&lt;br /&gt;
&lt;br /&gt;
Алгоритм параллельной реализации:&lt;br /&gt;
# Распределение элементов выборки. Процесс 0 распределяет поровну элементы выборки по остальным процессам.&lt;br /&gt;
# Инициализация параметров смеси гауссовых распределений. Процесс 0 инициализирует параметры и отправляет их остальным процессам. &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; инициализируются случайными значениями в отрезке  &amp;lt;math&amp;gt;[-1, 1]&amp;lt;/math&amp;gt;, ковариационные матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; определяются как единичные, веса &amp;lt;math&amp;gt;w_i&amp;lt;/math&amp;gt; кластеров задаются равными &amp;lt;math&amp;gt;\frac{1}{k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Выполнение E-шага и M-шага алгоритма до достижения максимального числа итераций.&lt;br /&gt;
## E-шаг. Каждый процесс вычисляет значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; по своему набору элементов выборки.&lt;br /&gt;
## M-шаг. &lt;br /&gt;
### Каждый процесс вычисляет суммы значений скрытых переменных &amp;lt;math&amp;gt;\sum_{i = 1}^{n\_proc_i}y_{ij}&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет значения &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt; по полученным суммам и отправляет их остальным процессам. Каждый процесс обновляет значения &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; по полученным значениям &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Каждый процесс вычисляет суммы &amp;lt;math&amp;gt;\sum_{i = 1}^{n\_proc_i}y_{ij}x_i&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет суммы &amp;lt;math&amp;gt;&amp;gt;\sum_{i = 1}^{n}y_{ij}x_i&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по всем элементам выборки и отправляет их остальным процессам. С помощью полученных сумм каждый процесс вычисляет значения математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Каждый процесс вычисляет суммы &amp;lt;math&amp;gt;sum_l = \sum_{i = 1}^{n\_proc_i}y_{ij}(x_{il} - \mu_{jl}^{new})^2 \, (l = \overline{1, q})&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет суммы &amp;lt;math&amp;gt;sum_l = \sum_{i = 1}^{n}y_{ij}(x_{il} - \mu_{jl}^{new})^2 \, (l = \overline{1, q})&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по всем элементам выборки и отправляет их остальным процессам. С помощью полученных сумм каждый процесс вычисляет значения диагональных элементов матриц ковариации &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Распараллеливание было проведено по числу элементов выборки, поэтому и исследование масштабируемости было проведено для числа элементов выборки. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
* число процессов [8 : 128] с шагом 8;&lt;br /&gt;
* число элементов выборки [1000000 : 20000000] с шагом 1000000;&lt;br /&gt;
* размерность элементов выборки 4;&lt;br /&gt;
* число кластеров 4;&lt;br /&gt;
* число итераций 50.&lt;br /&gt;
&lt;br /&gt;
Для каждого набора параметров измерялось среднее время выполнения одной итерации алгоритма. На следующем рисунке приведен график производительности данной реализации EM-алгоритма кластеризации в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Em-performance-Lavrushkin.png.png|thumb|1000px|center|Рисунок 8. Параллельная реализация EM-алгоритма кластеризации. Изменение производительности в зависимости от числа процессов и числа элементов выборки.]]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/HighVoltageRocknRoll/EM-clusterization_scalability Исследованная параллельная MPI-реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Em-performance-Lavrushkin.png&amp;diff=16470</id>
		<title>Файл:Em-performance-Lavrushkin.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Em-performance-Lavrushkin.png&amp;diff=16470"/>
		<updated>2016-11-11T22:29:01Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16469</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16469"/>
		<updated>2016-11-11T22:27:55Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{nk})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F http://www.machinelearning.ru/wiki/index.php?title=Кластеризация]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;x_{i} = (x_{i1}, ..., x_{iq})&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смеси гауссовых распределений в &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерном пространстве признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} }, &lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big)&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) http://www.machinelearning.ru/wiki/index.php?title=EM_алгоритм_(пример)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляются значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij}^2 = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}\sqrt{|\Sigma_j|}}\exp{\big\{-\frac{\delta_{ij}^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать. Пусть для вычисления сумм используется пирамида сдваиванием. Тогда сложность суммирования при вычислении скрытых переменных равна &amp;lt;math&amp;gt;O(\log{k})&amp;lt;/math&amp;gt;, а при обновлении вектора параметров — &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{nk})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Для исследования масштабируемости EM-алгоритм кластеризации был реализован с помощью технологии MPI. Была реализована версия алгоритма с диагональными матрицами ковариации. В качестве критерия останова было выбрано достижение максимального числа итераций (соответственно, вычисление логарифмического правдоподобия на каждой итерации не проводится).&lt;br /&gt;
&lt;br /&gt;
Алгоритм параллельной реализации:&lt;br /&gt;
# Распределение элементов выборки. Процесс 0 распределяет поровну элементы выборки по остальным процессам.&lt;br /&gt;
# Инициализация параметров смеси гауссовых распределений. Процесс 0 инициализирует параметры и отправляет их остальным процессам. &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; инициализируются случайными значениями в отрезке  &amp;lt;math&amp;gt;[-1, 1]&amp;lt;/math&amp;gt;, ковариационные матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; определяются как единичные, веса &amp;lt;math&amp;gt;w_i&amp;lt;/math&amp;gt; кластеров задаются равными &amp;lt;math&amp;gt;\frac{1}{k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Выполнение E-шага и M-шага алгоритма до достижения максимального числа итераций.&lt;br /&gt;
## E-шаг. Каждый процесс вычисляет значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; по своему набору элементов выборки.&lt;br /&gt;
## M-шаг. &lt;br /&gt;
### Каждый процесс вычисляет суммы значений скрытых переменных &amp;lt;math&amp;gt;\sum_{i = 1}^{n\_proc_i}y_{ij}&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет значения &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt; по полученным суммам и отправляет их остальным процессам. Каждый процесс обновляет значения &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; по полученным значениям &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Каждый процесс вычисляет суммы &amp;lt;math&amp;gt;\sum_{i = 1}^{n\_proc_i}y_{ij}x_i&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет суммы &amp;lt;math&amp;gt;&amp;gt;\sum_{i = 1}^{n}y_{ij}x_i&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по всем элементам выборки и отправляет их остальным процессам. С помощью полученных сумм каждый процесс вычисляет значения математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Каждый процесс вычисляет суммы &amp;lt;math&amp;gt;sum_l = \sum_{i = 1}^{n\_proc_i}y_{ij}(x_{il} - \mu_{jl}^{new})^2 \, (l = \overline{1, q})&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет суммы &amp;lt;math&amp;gt;sum_l = \sum_{i = 1}^{n}y_{ij}(x_{il} - \mu_{jl}^{new})^2 \, (l = \overline{1, q})&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по всем элементам выборки и отправляет их остальным процессам. С помощью полученных сумм каждый процесс вычисляет значения диагональных элементов матриц ковариации &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Распараллеливание было проведено по числу элементов выборки, поэтому и исследование масштабируемости было проведено для числа элементов выборки. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
* число процессов [8 : 128] с шагом 8;&lt;br /&gt;
* число элементов выборки [1000000 : 20000000] с шагом 1000000;&lt;br /&gt;
* размерность элементов выборки 4;&lt;br /&gt;
* число кластеров 4;&lt;br /&gt;
* число итераций 50.&lt;br /&gt;
&lt;br /&gt;
Для каждого набора параметров измерялось среднее время выполнения одной итерации алгоритма. На следующем рисунке приведен график производительности данной реализации EM-алгоритма кластеризации в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://github.com/HighVoltageRocknRoll/EM-clusterization_scalability Исследованная параллельная MPI-реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16465</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16465"/>
		<updated>2016-11-11T21:09:12Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{nk})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F http://www.machinelearning.ru/wiki/index.php?title=Кластеризация]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;x_{i} = (x_{i1}, ..., x_{iq})&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смеси гауссовых распределений в &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерном пространстве признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} }, &lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big)&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) http://www.machinelearning.ru/wiki/index.php?title=EM_алгоритм_(пример)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляются значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij}^2 = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}\sqrt{|\Sigma_j|}}\exp{\big\{-\frac{\delta_{ij}^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать. Пусть для вычисления сумм используется пирамида сдваиванием. Тогда сложность суммирования при вычислении скрытых переменных равна &amp;lt;math&amp;gt;O(\log{k})&amp;lt;/math&amp;gt;, а при обновлении вектора параметров — &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{nk})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Для исследования масштабируемости EM-алгоритм кластеризации был реализован с помощью технологии MPI. Была реализована версия алгоритма с диагональными матрицами ковариации. В качестве критерия останова было выбрано достижение максимального числа итераций (соответственно, вычисление логарифмического правдоподобия на каждой итерации не проводится).&lt;br /&gt;
&lt;br /&gt;
Алгоритм параллельной реализации:&lt;br /&gt;
# Распределение элементов выборки. Процесс 0 распределяет поровну элементы выборки по остальным процессам.&lt;br /&gt;
# Инициализация параметров смеси гауссовых распределений. Процесс 0 инициализирует параметры и отправляет их остальным процессам. &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; инициализируются случайными значениями в отрезке  &amp;lt;math&amp;gt;[-1, 1]&amp;lt;/math&amp;gt;, ковариационные матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; определяются как единичные, веса &amp;lt;math&amp;gt;w_i&amp;lt;/math&amp;gt; кластеров задаются равными &amp;lt;math&amp;gt;\frac{1}{k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Выполнение E-шага и M-шага алгоритма до достижения максимального числа итераций.&lt;br /&gt;
## E-шаг. Каждый процесс вычисляет значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; по своему набору элементов выборки.&lt;br /&gt;
## M-шаг. &lt;br /&gt;
### Каждый процесс вычисляет суммы значений скрытых переменных &amp;lt;math&amp;gt;\sum_{i = 1}^{n\_proc_i}y_{ij}&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет значения &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt; по полученным суммам и отправляет их остальным процессам. Каждый процесс обновляет значения &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; по полученным значениям &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Каждый процесс вычисляет суммы &amp;lt;math&amp;gt;\sum_{i = 1}^{n\_proc_i}y_{ij}x_i&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет суммы &amp;lt;math&amp;gt;&amp;gt;\sum_{i = 1}^{n}y_{ij}x_i&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по всем элементам выборки и отправляет их остальным процессам. С помощью полученных сумм каждый процесс вычисляет значения математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Каждый процесс вычисляет суммы &amp;lt;math&amp;gt;sum_l = \sum_{i = 1}^{n\_proc_i}y_{ij}(x_{il} - \mu_{jl}^{new})^2 \, (l = \overline{1, q})&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет суммы &amp;lt;math&amp;gt;sum_l = \sum_{i = 1}^{n}y_{ij}(x_{il} - \mu_{jl}^{new})^2 \, (l = \overline{1, q})&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по всем элементам выборки и отправляет их остальным процессам. С помощью полученных сумм каждый процесс вычисляет значения диагональных элементов матриц ковариации &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Распараллеливание было проведено по числу элементов выборки, поэтому и исследование масштабируемости было проведено для числа элементов выборки. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
* число процессоров [8 : 128] с шагом 8;&lt;br /&gt;
* число элементов выборки [1000000 : 20000000] с шагом 1000000;&lt;br /&gt;
* размерность элементов выборки 4;&lt;br /&gt;
* число кластеров 4;&lt;br /&gt;
* число итераций 50.&lt;br /&gt;
&lt;br /&gt;
Для каждого набора параметров измерялось среднее время выполнения одной итерации алгоритма. На следующем рисунке приведен график производительности данной реализации EM-алгоритма кластеризации в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/HighVoltageRocknRoll/EM-clusterization_scalability Исследованная параллельная MPI-реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16459</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16459"/>
		<updated>2016-11-11T20:04:16Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{nk})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F http://www.machinelearning.ru/wiki/index.php?title=Кластеризация]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;x_{i} = (x_{i1}, ..., x_{iq})&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смеси гауссовых распределений в &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерном пространстве признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} }, &lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big)&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) http://www.machinelearning.ru/wiki/index.php?title=EM_алгоритм_(пример)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляются значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij}^2 = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}\sqrt{|\Sigma_j|}}\exp{\big\{-\frac{\delta_{ij}^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать. Пусть для вычисления сумм используется пирамида сдваиванием. Тогда сложность суммирования при вычислении скрытых переменных равна &amp;lt;math&amp;gt;O(\log{k})&amp;lt;/math&amp;gt;, а при обновлении вектора параметров — &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{nk})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Для исследования масштабируемости EM-алгоритм кластеризации был реализован с помощью технологии MPI. Была реализована версия алгоритма с диагональными матрицами ковариации. В качестве критерия останова было выбрано достижение максимального числа итераций (соответственно, вычисление логарифмического правдоподобия на каждой итерации не проводится).&lt;br /&gt;
&lt;br /&gt;
Алгоритм параллельной реализации:&lt;br /&gt;
# Распределение элементов выборки. Процесс 0 распределяет поровну элементы выборки по остальным процессам.&lt;br /&gt;
# Инициализация параметров смеси гауссовых распределений. Процесс 0 инициализирует параметры и отправляет их остальным процессам. &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; инициализируются случайными значениями в отрезке  &amp;lt;math&amp;gt;[-1, 1]&amp;lt;/math&amp;gt;, ковариационные матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; определяются как единичные, веса &amp;lt;math&amp;gt;w_i&amp;lt;/math&amp;gt; кластеров задаются равными &amp;lt;math&amp;gt;\frac{1}{k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Выполнение E-шага и M-шага алгоритма до достижения максимального числа итераций.&lt;br /&gt;
## E-шаг. Каждый процесс вычисляет значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; по своему набору элементов выборки.&lt;br /&gt;
## M-шаг. &lt;br /&gt;
### Каждый процесс вычисляет суммы значений скрытых переменных &amp;lt;math&amp;gt;\sum_{i = 1}^{n\_proc_i}y_{ij}&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет значения &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt; по полученным суммам и отправляет их остальным процессам. Каждый процесс обновляет значения &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; по полученным значениям &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Каждый процесс вычисляет суммы &amp;lt;math&amp;gt;\sum_{i = 1}^{n\_proc_i}y_{ij}x_i&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет суммы &amp;lt;math&amp;gt;&amp;gt;\sum_{i = 1}^{n}y_{ij}x_i&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по всем элементам выборки и отправляет их остальным процессам. С помощью полученных сумм каждый процесс вычисляет значения математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Каждый процесс вычисляет суммы &amp;lt;math&amp;gt;sum_l = \sum_{i = 1}^{n\_proc_i}y_{ij}(x_{il} - \mu_{jl}^{new})^2 \, (l = \overline{1, q})&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет суммы &amp;lt;math&amp;gt;sum_l = \sum_{i = 1}^{n}y_{ij}(x_{il} - \mu_{jl}^{new})^2 \, (l = \overline{1, q})&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по всем элементам выборки и отправляет их остальным процессам. С помощью полученных сумм каждый процесс вычисляет значения диагональных элементов матриц ковариации &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Распараллеливание было проведено по числу элементов выборки, поэтому и исследование масштабируемости было проведено для числа элементов выборки. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
* число процессоров [8 : 128] с шагом 8;&lt;br /&gt;
* число элементов выборки [1000000 : 20000000] с шагом 1000000;&lt;br /&gt;
* размерность элементов выборки 4;&lt;br /&gt;
* число кластеров 4;&lt;br /&gt;
* число итераций 50.&lt;br /&gt;
&lt;br /&gt;
Для каждого набора параметров измерялось среднее время выполнения одной итерации EM-алгоритма кластеризации. На следующем рисунке приведен график производительности данной реализации EM-алгоритма кластеризации в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[ Исследованная параллельная MPI-реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16458</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16458"/>
		<updated>2016-11-11T20:02:13Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{nk})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F http://www.machinelearning.ru/wiki/index.php?title=Кластеризация]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;x_{i} = (x_{i1}, ..., x_{iq})&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смеси гауссовых распределений в &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерном пространстве признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} }, &lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big)&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) http://www.machinelearning.ru/wiki/index.php?title=EM_алгоритм_(пример)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляются значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij}^2 = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}\sqrt{|\Sigma_j|}}\exp{\big\{-\frac{\delta_{ij}^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать. Пусть для вычисления сумм используется пирамида сдваиванием. Тогда сложность суммирования при вычислении скрытых переменных равна &amp;lt;math&amp;gt;O(\log{k})&amp;lt;/math&amp;gt;, а при обновлении вектора параметров — &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{nk})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Для исследования масштабируемости EM-алгоритм кластеризации был реализован с помощью технологии MPI. Была реализована версия алгоритма с диагональными матрицами ковариации. В качестве критерия останова было выбрано достижение максимального числа итераций (соответственно, вычисление логарифмического правдоподобия на каждой итерации не проводится).&lt;br /&gt;
&lt;br /&gt;
Алгоритм параллельной реализации:&lt;br /&gt;
# Распределение элементов выборки. Процесс 0 распределяет поровну элементы выборки по остальным процессам.&lt;br /&gt;
# Инициализация параметров смеси гауссовых распределений. Процесс 0 инициализирует параметры и отправляет их остальным процессам. &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; инициализируются случайными значениями в отрезке  &amp;lt;math&amp;gt;[-1, 1]&amp;lt;/math&amp;gt;, ковариационные матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; определяются как единичные, веса &amp;lt;math&amp;gt;w_i&amp;lt;/math&amp;gt; кластеров задаются равными &amp;lt;math&amp;gt;\frac{1}{k}&amp;lt;/math&amp;gt;&lt;br /&gt;
# Выполнение E-шага и M-шага алгоритма до достижения максимального числа итераций.&lt;br /&gt;
## E-шаг. Каждый процесс вычисляет значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; по своему набору элементов выборки.&lt;br /&gt;
## M-шаг. &lt;br /&gt;
### Каждый процесс вычисляет суммы значений скрытых переменных &amp;lt;math&amp;gt;\sum_{i = 1}^{n\_proc_i}y_{ij}&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет значения &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt; по полученным суммам и отправляет их остальным процессам. Каждый процесс обновляет значения &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; по полученным значениям &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Каждый процесс вычисляет суммы &amp;lt;math&amp;gt;\sum_{i = 1}^{n\_proc_i}y_{ij}x_i&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет суммы &amp;lt;math&amp;gt;&amp;gt;\sum_{i = 1}^{n}y_{ij}x_i&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по всем элементам выборки и отправляет их остальным процессам. С помощью полученных сумм каждый процесс вычисляет значения математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Каждый процесс вычисляет суммы &amp;lt;math&amp;gt;sum_l = \sum_{i = 1}^{n\_proc_i}y_{ij}(x_{il} - \mu_{jl}^{new})^2 \, (l = \overline{1, q})&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет суммы &amp;lt;math&amp;gt;sum_l = \sum_{i = 1}^{n}y_{ij}(x_{il} - \mu_{jl}^{new})^2 \, (l = \overline{1, q})&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по всем элементам выборки и отправляет их остальным процессам. С помощью полученных сумм каждый процесс вычисляет значения диагональных элементов матриц ковариации &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Распараллеливание было проведено по числу элементов выборки, поэтому и исследование масштабируемости было проведено для числа элементов выборки. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
* число процессоров [8 : 128] с шагом 8;&lt;br /&gt;
* число элементов выборки [1000000 : 20000000] с шагом 1000000;&lt;br /&gt;
* размерность элементов выборки 4;&lt;br /&gt;
* число кластеров 4.&lt;br /&gt;
&lt;br /&gt;
На следующем рисунке приведен график производительности данной реализации EM-алгоритма кластеризации в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[ Исследованная параллельная MPI-реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16457</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16457"/>
		<updated>2016-11-11T20:01:15Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{nk})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F http://www.machinelearning.ru/wiki/index.php?title=Кластеризация]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;x_{i} = (x_{i1}, ..., x_{iq})&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смеси гауссовых распределений в &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерном пространстве признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} }, &lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big)&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) http://www.machinelearning.ru/wiki/index.php?title=EM_алгоритм_(пример)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляются значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij}^2 = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}\sqrt{|\Sigma_j|}}\exp{\big\{-\frac{\delta_{ij}^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать. Пусть для вычисления сумм используется пирамида сдваиванием. Тогда сложность суммирования при вычислении скрытых переменных равна &amp;lt;math&amp;gt;O(\log{k})&amp;lt;/math&amp;gt;, а при обновлении вектора параметров — &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{nk})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Для исследования масштабируемости EM-алгоритм кластеризации был реализован с помощью технологии MPI. Была реализована версия алгоритма с диагональными матрицами ковариации. В качестве критерия останова было выбрано достижение максимального числа итераций (соответственно, вычисление логарифмического правдоподобия на каждой итерации не проводится).&lt;br /&gt;
&lt;br /&gt;
Алгоритм параллельной реализации:&lt;br /&gt;
# Распределение элементов выборки. Процесс 0 распределяет поровну элементы выборки по остальным процессам.&lt;br /&gt;
# Инициализация параметров смеси гауссовых распределений. Процесс 0 инициализирует параметры и отправляет их остальным процессам. &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; инициализируются случайными значениями в отрезке  &amp;lt;math&amp;gt;[-1, 1]&amp;lt;/math&amp;gt;, ковариационные матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; определяются как единичные, веса &amp;lt;math&amp;gt;w_i&amp;lt;/math&amp;gt; кластеров задаются равными &amp;lt;math&amp;gt;\frac{1}{k}&amp;lt;/math&amp;gt;&lt;br /&gt;
# Выполнение E-шага и M-шага алгоритма до достижения максимального числа итераций.&lt;br /&gt;
## E-шаг. Каждый процесс вычисляет значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; по своему набору элементов выборки.&lt;br /&gt;
## M-шаг. &lt;br /&gt;
### Каждый процесс вычисляет суммы значений скрытых переменных &amp;lt;math&amp;gt;\sum_{i = 1}^{n\_proc_i}y_{ij}&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет значения &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt; по полученным суммам и отправляет их остальным процессам. Каждый процесс обновляет значения &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; по полученным значениям &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Каждый процесс вычисляет суммы &amp;lt;math&amp;gt;\sum_{i = 1}^{n\_proc_i}y_{ij}x_i&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет суммы &amp;lt;math&amp;gt;&amp;gt;\sum_{i = 1}^{n}y_{ij}x_i&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по всем элементам выборки и отправляет их остальным процессам. С помощью полученных сумм каждый процесс вычисляет значения математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Каждый процесс вычисляет суммы &amp;lt;math&amp;gt;sum_l = \sum_{i = 1}^{n\_proc_i}y_{ij}(x_{il} - \mu_{jl}^{new})^2 \quad (l = \overline{1, q})&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет суммы &amp;lt;math&amp;gt;sum_l = \sum_{i = 1}^{n}y_{ij}(x_{il} - \mu_{jl}^{new})^2 \quad (l = \overline{1, q})&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по всем элементам выборки и отправляет их остальным процессам. С помощью полученных сумм каждый процесс вычисляет значения диагональных элементов матриц ковариации &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Распараллеливание было проведено по числу элементов выборки, поэтому и исследование масштабируемости было проведено для числа элементов выборки. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
* число процессоров [8 : 128] с шагом 8;&lt;br /&gt;
* число элементов выборки [1000000 : 20000000] с шагом 1000000;&lt;br /&gt;
* размерность элементов выборки 4;&lt;br /&gt;
* число кластеров 4.&lt;br /&gt;
&lt;br /&gt;
На следующем рисунке приведен график производительности данной реализации EM-алгоритма кластеризации в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[ Исследованная параллельная MPI-реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16456</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16456"/>
		<updated>2016-11-11T19:59:19Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{nk})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F http://www.machinelearning.ru/wiki/index.php?title=Кластеризация]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;x_{i} = (x_{i1}, ..., x_{iq})&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смеси гауссовых распределений в &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерном пространстве признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} }, &lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big)&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) http://www.machinelearning.ru/wiki/index.php?title=EM_алгоритм_(пример)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляются значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij}^2 = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}\sqrt{|\Sigma_j|}}\exp{\big\{-\frac{\delta_{ij}^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать. Пусть для вычисления сумм используется пирамида сдваиванием. Тогда сложность суммирования при вычислении скрытых переменных равна &amp;lt;math&amp;gt;O(\log{k})&amp;lt;/math&amp;gt;, а при обновлении вектора параметров — &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{nk})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Для исследования масштабируемости EM-алгоритм кластеризации был реализован с помощью технологии MPI. Была реализована версия алгоритма с диагональными матрицами ковариации. В качестве критерия останова было выбрано достижение максимального числа итераций (соответственно, вычисление логарифмического правдоподобия на каждой итерации не проводится).&lt;br /&gt;
&lt;br /&gt;
Алгоритм параллельной реализации:&lt;br /&gt;
# Распределение элементов выборки. Процесс 0 распределяет поровну элементы выборки по остальным процессам.&lt;br /&gt;
# Инициализация параметров смеси гауссовых распределений. Процесс 0 инициализирует параметры и отправляет их остальным процессам. &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; инициализируются случайными значениями в отрезке  &amp;lt;math&amp;gt;[-1, 1]&amp;lt;/math&amp;gt;, ковариационные матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; определяются как единичные, веса &amp;lt;math&amp;gt;w_i&amp;lt;/math&amp;gt; кластеров задаются равными &amp;lt;math&amp;gt;\frac{1}{k}&amp;lt;/math&amp;gt;&lt;br /&gt;
# Выполнение E-шага и M-шага алгоритма до достижения максимального числа итераций.&lt;br /&gt;
## E-шаг. Каждый процесс вычисляет значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; по своему набору элементов выборки.&lt;br /&gt;
## M-шаг. &lt;br /&gt;
### Каждый процесс вычисляет суммы значений скрытых переменных &amp;lt;math&amp;gt;\sum_{i = 1}^{n\_proc_i}y_{ij}&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет значения &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt; по полученным суммам и отправляет их остальным процессам. Каждый процесс обновляет значения &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; по полученным значениям &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Каждый процесс вычисляет суммы &amp;lt;math&amp;gt;\sum_{i = 1}^{n\_proc_i}y_{ij}x_i&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет суммы &amp;lt;math&amp;gt;&amp;gt;\sum_{i = 1}^{n}y_{ij}x_i&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по всем элементам выборки и отправляет их остальным процессам. С помощью полученных сумм каждый процесс вычисляет значения математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Каждый процесс вычисляет суммы &amp;lt;math&amp;gt;sum_l = \sum_{i = 1}^{n\_proc_i}y_{ij}(x_{il} - \mu_{jl}^{new})^2 (l = \overline{1, q})&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по своему набору элементов выборки и отправляет полученные суммы процессу 0. Процесс 0 вычисляет суммы &amp;lt;math&amp;gt;sum_l = \sum_{i = 1}^{n}y_{ij}(x_{il} - \mu_{jl}^{new})^2 (l = \overline{1, q})&amp;lt;/math&amp;gt; для каждого кластера &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt; по всем элементам выборки и отправляет их остальным процессам. С помощью полученных сумм каждый процесс вычисляет значения диагональных элементов матриц ковариации &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Распараллеливание было проведено по числу элементов выборки, поэтому и исследование масштабируемости было проведено для числа элементов выборки. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
* число процессоров [8 : 128] с шагом 8;&lt;br /&gt;
* число элементов выборки [1000000 : 20000000] с шагом 1000000;&lt;br /&gt;
* размерность элементов выборки 4;&lt;br /&gt;
* число кластеров 4.&lt;br /&gt;
&lt;br /&gt;
На следующем рисунке приведен график производительности данной реализации EM-алгоритма кластеризации в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[ Исследованная параллельная MPI-реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16431</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16431"/>
		<updated>2016-11-11T14:43:50Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* EM-алгоритм */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{nk})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F http://www.machinelearning.ru/wiki/index.php?title=Кластеризация]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;x_{i} = (x_{i1}, ..., x_{iq})&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смеси гауссовых распределений в &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерном пространстве признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} }, &lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big)&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) http://www.machinelearning.ru/wiki/index.php?title=EM_алгоритм_(пример)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляются значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij}^2 = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}\sqrt{|\Sigma_j|}}\exp{\big\{-\frac{\delta_{ij}^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать. Пусть для вычисления сумм используется пирамида сдваиванием. Тогда сложность суммирования при вычислении скрытых переменных равна &amp;lt;math&amp;gt;O(\log{k})&amp;lt;/math&amp;gt;, а при обновлении вектора параметров — &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{nk})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16430</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16430"/>
		<updated>2016-11-11T14:37:36Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* EM-алгоритм */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{nk})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F http://www.machinelearning.ru/wiki/index.php?title=Кластеризация]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;x_{i} = (x_{i1}, ..., x_{iq})&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смеси гауссовых распределений в &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерном пространстве признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} }, &lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big)&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) http://www.machinelearning.ru/wiki/index.php?title=EM_алгоритм_(пример)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляем значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij}^2 = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}\sqrt{|\Sigma_j|}}\exp{\big\{-\frac{\delta_{ij}^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать. Пусть для вычисления сумм используется пирамида сдваиванием. Тогда сложность суммирования при вычислении скрытых переменных равна &amp;lt;math&amp;gt;O(\log{k})&amp;lt;/math&amp;gt;, а при обновлении вектора параметров — &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{nk})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16429</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16429"/>
		<updated>2016-11-11T14:36:02Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Постановка задачи разделения смеси гауссовых распределений */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{nk})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F http://www.machinelearning.ru/wiki/index.php?title=Кластеризация]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;x_{i} = (x_{i1}, ..., x_{iq})&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смеси гауссовых распределений в &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерном пространстве признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} }, &lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big)&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) www.machinelearning.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляем значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij}^2 = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}\sqrt{|\Sigma_j|}}\exp{\big\{-\frac{\delta_{ij}^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать. Пусть для вычисления сумм используется пирамида сдваиванием. Тогда сложность суммирования при вычислении скрытых переменных равна &amp;lt;math&amp;gt;O(\log{k})&amp;lt;/math&amp;gt;, а при обновлении вектора параметров — &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{nk})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16428</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16428"/>
		<updated>2016-11-11T14:35:36Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Кластеризация с помощью EM-алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{nk})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F http://www.machinelearning.ru/wiki/index.php?title=Кластеризация]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;x_{i} = (x_{i1}, ..., x_{iq})&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смеси гауссовых распределений в &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерном пространстве признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} }, &lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big)&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm www.coursera.org]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) www.machinelearning.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляем значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij}^2 = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}\sqrt{|\Sigma_j|}}\exp{\big\{-\frac{\delta_{ij}^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать. Пусть для вычисления сумм используется пирамида сдваиванием. Тогда сложность суммирования при вычислении скрытых переменных равна &amp;lt;math&amp;gt;O(\log{k})&amp;lt;/math&amp;gt;, а при обновлении вектора параметров — &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{nk})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16427</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16427"/>
		<updated>2016-11-11T14:34:49Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* EM-алгоритм */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{nk})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F www.machinelearning.ru]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em basegroup.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;x_{i} = (x_{i1}, ..., x_{iq})&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смеси гауссовых распределений в &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерном пространстве признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} }, &lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big)&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm www.coursera.org]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) www.machinelearning.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляем значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij}^2 = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}\sqrt{|\Sigma_j|}}\exp{\big\{-\frac{\delta_{ij}^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать. Пусть для вычисления сумм используется пирамида сдваиванием. Тогда сложность суммирования при вычислении скрытых переменных равна &amp;lt;math&amp;gt;O(\log{k})&amp;lt;/math&amp;gt;, а при обновлении вектора параметров — &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{nk})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16214</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16214"/>
		<updated>2016-11-08T23:52:42Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{nk})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F www.machinelearning.ru]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em basegroup.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;x_{i} = (x_{i1}, ..., x_{iq})&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смеси гауссовых распределений в &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерном пространстве признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} }, &lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big)&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm www.coursera.org]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) www.machinelearning.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляем значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij}^2 = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}\sqrt{|\Sigma_j|}}\exp{\big\{-\frac{\delta_{ij}^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать. Пусть для вычисления сумм используется пирамида сдваиванием. Тогда сложность суммирования при вычислении скрытых переменных равна &amp;lt;math&amp;gt;O(\log{k})&amp;lt;/math&amp;gt;, а при обновлении вектора параметров — &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{nk})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16213</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16213"/>
		<updated>2016-11-08T23:47:38Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{nk})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F www.machinelearning.ru]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em basegroup.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;x_{i} = (x_{i1}, ..., x_{iq})&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смеси гауссовых распределений в &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерном пространстве признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} }, &lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big)&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm www.coursera.org]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) www.machinelearning.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляем значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij}^2 = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}\sqrt{|\Sigma_j|}}\exp{\big\{-\frac{\delta_{ij}^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать. Пусть для вычисления сумм используется пирамида сдваиванием. Тогда сложность суммирования при вычислении скрытых переменных равна &amp;lt;math&amp;gt;O(\log{k})&amp;lt;/math&amp;gt;, а при обновлении вектора параметров - &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{nk})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16212</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16212"/>
		<updated>2016-11-08T23:46:48Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{nk})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F www.machinelearning.ru]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em basegroup.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;x_{i} = (x_{i1}, ..., x_{iq})&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смеси гауссовых распределений в &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерном пространстве признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} }, &lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big)&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm www.coursera.org]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) www.machinelearning.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляем значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij}^2 = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}\sqrt{|\Sigma_j|}}\exp{\big\{-\frac{\delta_{ij}^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать. Пусть для вычисления сумм используется пирамида сдваиванием. Тогда сложность суммирования при вычислении скрытых переменных равна &amp;lt;math&amp;gt;O(\log{k})&amp;lt;/math&amp;gt;, а при обновлении вектора параметров - &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{kn})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16211</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16211"/>
		<updated>2016-11-08T23:46:26Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F www.machinelearning.ru]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em basegroup.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;x_{i} = (x_{i1}, ..., x_{iq})&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смеси гауссовых распределений в &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерном пространстве признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} }, &lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big)&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm www.coursera.org]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) www.machinelearning.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляем значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij}^2 = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}\sqrt{|\Sigma_j|}}\exp{\big\{-\frac{\delta_{ij}^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать. Пусть для вычисления сумм используется пирамида сдваиванием. Тогда сложность суммирования при вычислении скрытых переменных равна &amp;lt;math&amp;gt;O(\log{k})&amp;lt;/math&amp;gt;, а при обновлении вектора параметров - &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{kn})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16182</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16182"/>
		<updated>2016-11-08T17:00:29Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F www.machinelearning.ru]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em basegroup.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;x_{i} = (x_{i1}, ..., x_{iq})&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смеси гауссовых распределений в &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерном пространстве признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} }, &lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big)&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm www.coursera.org]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) www.machinelearning.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляем значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij}^2 = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}\sqrt{|\Sigma_j|}}\exp{\big\{-\frac{\delta_{ij}^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать, также как и суммирование при вычислении скрытых переменных. Пусть для вычисления сумм при обновлении вектора параметров используется пирамида сдваиванием. Тогда их сложность будет равна &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{n})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16171</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16171"/>
		<updated>2016-11-08T16:30:30Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F www.machinelearning.ru]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em basegroup.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;x_{i} = (x_{i1}, ..., x_{iq})&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смеси гауссовых распределений в &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерном пространстве признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} }, &lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big)&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm www.coursera.org]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) www.machinelearning.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляем значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij} = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}\sqrt{|\Sigma_j|}}\exp{\big\{-\frac{\delta^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать, также как и суммирование при вычислении скрытых переменных. Пусть для вычисления сумм при обновлении вектора параметров используется пирамида сдваиванием. Тогда их сложность будет равна &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{n})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16170</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16170"/>
		<updated>2016-11-08T16:25:48Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Постановка задачи разделения смеси гауссовых распределений */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F www.machinelearning.ru]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em basegroup.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;x_{i} = (x_{i1}, ..., x_{iq})&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смеси гауссовых распределений в &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерном пространстве признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} }, &lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big)&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm www.coursera.org]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) www.machinelearning.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляем значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij} = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{\delta^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать, также как и суммирование при вычислении скрытых переменных. Пусть для вычисления сумм при обновлении вектора параметров используется пирамида сдваиванием. Тогда их сложность будет равна &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{n})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16169</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16169"/>
		<updated>2016-11-08T16:25:13Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Постановка задачи разделения смеси гауссовых распределений */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F www.machinelearning.ru]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em basegroup.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;x_{i} = (x_{i1}, ..., x_{iq})&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смеси гауссовых распределений в &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерном пространстве признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} }, &lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* \delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big) — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm www.coursera.org]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) www.machinelearning.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляем значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij} = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{\delta^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать, также как и суммирование при вычислении скрытых переменных. Пусть для вычисления сумм при обновлении вектора параметров используется пирамида сдваиванием. Тогда их сложность будет равна &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{n})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16168</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16168"/>
		<updated>2016-11-08T16:23:47Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Постановка задачи разделения смеси гауссовых распределений */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F www.machinelearning.ru]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em basegroup.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;x_{i} = (x_{i1}, ..., x_{iq})&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смеси гауссовых распределений в &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерном пространстве признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} },\\ &lt;br /&gt;
&amp;amp; \delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm www.coursera.org]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) www.machinelearning.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляем значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij} = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{\delta^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать, также как и суммирование при вычислении скрытых переменных. Пусть для вычисления сумм при обновлении вектора параметров используется пирамида сдваиванием. Тогда их сложность будет равна &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{n})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16167</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16167"/>
		<updated>2016-11-08T16:23:34Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Постановка задачи разделения смеси гауссовых распределений */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F www.machinelearning.ru]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em basegroup.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;x_{i} = (x_{i1}, ..., x_{iq})&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смести гауссовых распределений в &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерном пространстве признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} },\\ &lt;br /&gt;
&amp;amp; \delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm www.coursera.org]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) www.machinelearning.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляем значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij} = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{\delta^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать, также как и суммирование при вычислении скрытых переменных. Пусть для вычисления сумм при обновлении вектора параметров используется пирамида сдваиванием. Тогда их сложность будет равна &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{n})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16166</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16166"/>
		<updated>2016-11-08T16:22:41Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Постановка задачи разделения смеси гауссовых распределений */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F www.machinelearning.ru]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em basegroup.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;x_{i} = (x_{i1}, ..., x_{iq})&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смести гауссовых распределений &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} },\\ &lt;br /&gt;
&amp;amp; \delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm www.coursera.org]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) www.machinelearning.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляем значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij} = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{\delta^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать, также как и суммирование при вычислении скрытых переменных. Пусть для вычисления сумм при обновлении вектора параметров используется пирамида сдваиванием. Тогда их сложность будет равна &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{n})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16165</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16165"/>
		<updated>2016-11-08T16:20:54Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F www.machinelearning.ru]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em basegroup.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;x_{i} = (x_{i1}, ..., x_{iq})&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смести гауссовых распределений предполагается, что все компоненты имеют многомерное нормальное распределение. То есть в случае &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} },\\ &lt;br /&gt;
&amp;amp; \delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm www.coursera.org]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) www.machinelearning.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляем значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij} = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{\delta^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать, также как и суммирование при вычислении скрытых переменных. Пусть для вычисления сумм при обновлении вектора параметров используется пирамида сдваиванием. Тогда их сложность будет равна &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{n})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16164</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16164"/>
		<updated>2016-11-08T16:20:23Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F www.machinelearning.ru]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em basegroup.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;x_{i} = (x_{i}^1, ..., x_{i}^q)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смести гауссовых распределений предполагается, что все компоненты имеют многомерное нормальное распределение. То есть в случае &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} },\\ &lt;br /&gt;
&amp;amp; \delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm www.coursera.org]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) www.machinelearning.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляем значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij} = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{\delta^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать, также как и суммирование при вычислении скрытых переменных. Пусть для вычисления сумм при обновлении вектора параметров используется пирамида сдваиванием. Тогда их сложность будет равна &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{n})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16163</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16163"/>
		<updated>2016-11-08T16:20:07Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F www.machinelearning.ru]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em basegroup.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\x_{i} = (x_{i}^1, ..., x_{i}^q)\&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смести гауссовых распределений предполагается, что все компоненты имеют многомерное нормальное распределение. То есть в случае &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} },\\ &lt;br /&gt;
&amp;amp; \delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm www.coursera.org]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) www.machinelearning.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляем значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij} = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{\delta^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать, также как и суммирование при вычислении скрытых переменных. Пусть для вычисления сумм при обновлении вектора параметров используется пирамида сдваиванием. Тогда их сложность будет равна &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{n})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16162</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16162"/>
		<updated>2016-11-08T16:19:49Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F www.machinelearning.ru]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em basegroup.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\{x_{i} = (x_{i}^1, ..., x_{i}^q)\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смести гауссовых распределений предполагается, что все компоненты имеют многомерное нормальное распределение. То есть в случае &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} },\\ &lt;br /&gt;
&amp;amp; \delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm www.coursera.org]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) www.machinelearning.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляем значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij} = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{\delta^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать, также как и суммирование при вычислении скрытых переменных. Пусть для вычисления сумм при обновлении вектора параметров используется пирамида сдваиванием. Тогда их сложность будет равна &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{n})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16161</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16161"/>
		<updated>2016-11-08T16:18:07Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F www.machinelearning.ru]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em basegroup.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений размерности &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смести гауссовых распределений предполагается, что все компоненты имеют многомерное нормальное распределение. То есть в случае &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} },\\ &lt;br /&gt;
&amp;amp; \delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm www.coursera.org]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) www.machinelearning.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляем значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij} = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{\delta^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать, также как и суммирование при вычислении скрытых переменных. Пусть для вычисления сумм при обновлении вектора параметров используется пирамида сдваиванием. Тогда их сложность будет равна &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{n})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16159</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16159"/>
		<updated>2016-11-08T16:16:48Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* EM-алгоритм */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F www.machinelearning.ru]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em basegroup.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смести гауссовых распределений предполагается, что все компоненты имеют многомерное нормальное распределение. То есть в случае &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} },\\ &lt;br /&gt;
&amp;amp; \delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm www.coursera.org]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) www.machinelearning.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единичные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляем значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij} = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{\delta^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать, также как и суммирование при вычислении скрытых переменных. Пусть для вычисления сумм при обновлении вектора параметров используется пирамида сдваиванием. Тогда их сложность будет равна &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{n})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16158</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=16158"/>
		<updated>2016-11-08T16:16:10Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F www.machinelearning.ru]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em basegroup.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смести гауссовых распределений предполагается, что все компоненты имеют многомерное нормальное распределение. То есть в случае &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} },\\ &lt;br /&gt;
&amp;amp; \delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm www.coursera.org]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) www.machinelearning.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единчиные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляем значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij} = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{(2 \pi)}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{\delta^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать, также как и суммирование при вычислении скрытых переменных. Пусть для вычисления сумм при обновлении вектора параметров используется пирамида сдваиванием. Тогда их сложность будет равна &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{n})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=14895</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=14895"/>
		<updated>2016-10-30T17:18:26Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F www.machinelearning.ru]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em basegroup.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смести гауссовых распределений предполагается, что все компоненты имеют многомерное нормальное распределение. То есть в случае &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} },\\ &lt;br /&gt;
&amp;amp; \delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm www.coursera.org]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) www.machinelearning.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единчиные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляем значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij} = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{\delta^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать, также как и суммирование при вычислении скрытых переменных. Пусть для вычисления сумм при обновлении вектора параметров используется пирамида сдваиванием. Тогда их сложность будет равна &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{n})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=14890</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=14890"/>
		<updated>2016-10-30T17:09:23Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F www.machinelearning.ru]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em basegroup.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смести гауссовых распределений предполагается, что все компоненты имеют многомерное нормальное распределение. То есть в случае &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} },\\ &lt;br /&gt;
&amp;amp; \delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm www.coursera.org]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) www.machinelearning.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единчиные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляем значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij} = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{\delta^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать, также как и суммирование при вычислении скрытых переменных. Пусть для вычисления сумм при обновлении вектора параметров используется пирамида сдваиванием. Тогда их сложность будет равна &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{n})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=14889</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=14889"/>
		<updated>2016-10-30T17:08:44Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O()&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F www.machinelearning.ru]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em basegroup.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смести гауссовых распределений предполагается, что все компоненты имеют многомерное нормальное распределение. То есть в случае &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} },\\ &lt;br /&gt;
&amp;amp; \delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm www.coursera.org]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) www.machinelearning.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единчиные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляем значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij} = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{\delta^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать, также как и суммирование при вычислении скрытых переменных. Пусть для вычисления сумм при обновлении вектора параметров используется пирамида сдваиванием. Тогда их сложность будет равна &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{n})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=14886</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=14886"/>
		<updated>2016-10-30T17:07:50Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O()&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F www.machinelearning.ru]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em basegroup.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смести гауссовых распределений предполагается, что все компоненты имеют многомерное нормальное распределение. То есть в случае &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} },\\ &lt;br /&gt;
&amp;amp; \delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm www.coursera.org]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) www.machinelearning.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единчиные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляем значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij} = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{\delta^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;). Тогда вычисление обратных матриц и определителей ковариационных матриц можно не учитывать, также как и суммирование при вычислении скрытых переменных. Пусть для вычисления сумм при обновлении вектора параметров используется пирамида сдваиванием. Тогда сложность вычисления сумм при обновлении вектора параметров будет равна &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt;. Следовательно, при классификации по высоте ЯПФ его сложность будет &amp;lt;math&amp;gt;O(\log{n})&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=14875</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=14875"/>
		<updated>2016-10-30T17:00:24Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O()&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F www.machinelearning.ru]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em basegroup.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смести гауссовых распределений предполагается, что все компоненты имеют многомерное нормальное распределение. То есть в случае &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} },\\ &lt;br /&gt;
&amp;amp; \delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm www.coursera.org]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) www.machinelearning.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единчиные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляем значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij} = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{\delta^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;. Сложность ЯПФ при классификации по высоте зависит от способа вычисления обратных матриц и определителей ковариационных матриц, а также от способа суммирования при вычислении скрытых переменных и обновлении вектора параметров. Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=14874</id>
		<title>Участник:Sergey Lavrushkin/EM-алгоритм кластеризации</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:Sergey_Lavrushkin/EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=14874"/>
		<updated>2016-10-30T16:59:04Z</updated>

		<summary type="html">&lt;p&gt;Sergey Lavrushkin: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации (1 итерация)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O()&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник: Sergey Lavrushkin|Сергей Лаврушкин]] (группа 620)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) — алгоритм, используемый в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&amp;lt;ref&amp;gt;ЕМ-алгоритм, его модификации и обобщения [http://www.machinelearning.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC http://www.machinelearning.ru/]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов:&lt;br /&gt;
* К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
* Ко второму типу задач можно отнести те задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
Алгоритм основан на методике итеративного вычисления оценок максимального правдоподобия, предложенной в 1977 г. (A. P. Demster, N. M. Laird, D. B. Rubin. Maximum Likelihood from Incomplete Data via the EM Algorithm).&amp;lt;ref&amp;gt; A. Dempster, N. Laird and D. Rubin. Maximum likelihood estimation from incomplete data. – Journal of the Royal Statistical Society, Series B, 1977, vol. 39, p. 1-38.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Кластеризация с помощью EM-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Кластеризация — задача разбиения заданной выборки объектов (ситуаций) на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались &amp;lt;ref&amp;gt;Кластеризация [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F www.machinelearning.ru]&amp;lt;/ref&amp;gt;. В основе идеи применения EM-алгоритма для кластеризации лежит предположение, что исследуемое множество данных может быть смоделировано с помощью линейной комбинации многомерных нормальных распределений, а целью является оценка параметров распределения, которые максимизируют логарифмическую функцию правдоподобия, используемую в качестве меры качества модели. К оцениваемым параметрам относятся математические ожидания и ковариационные матрицы. Предполагается, что любое наблюдение принадлежит ко всем кластерам, но с разной вероятностью. Задача заключается в &amp;quot;подгонке&amp;quot; распределений смеси к данным, а затем в определении вероятностей принадлежности наблюдения к каждому кластеру. Наблюдение должно быть отнесено к тому кластеру, для которого данная вероятность выше.&lt;br /&gt;
&lt;br /&gt;
Алгоритм EM основан на вычислении расстояний. Он может рассматриваться как обобщение кластеризации на основе анализа смеси вероятностных распределений. В процессе работы алгоритма происходит итеративное улучшение решения, а остановка осуществляется в момент, когда достигается требуемый уровень точности модели. Мерой в данном случае является монотонно увеличивающаяся статистическая величина, называемая логарифмическим правдоподобием.&amp;lt;ref&amp;gt;EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em basegroup.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: &lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров,&lt;br /&gt;
* &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
* &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений,&lt;br /&gt;
* &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
==== Постановка задачи разделения смеси гауссовых распределений ====&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;w_1, ..., w_k&amp;lt;/math&amp;gt; — априорные вероятности кластеров, &amp;lt;math&amp;gt;p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt; — плотности распределения кластеров.&lt;br /&gt;
Тогда плотность распределения вектора признаков &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; сразу по всем кластерам равна:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Необходимо на основе выборки оценить параметры модели &amp;lt;math&amp;gt;w_1, ..., w_k, p_1(x), ..., p_k(x)&amp;lt;/math&amp;gt;. Это позволит оценивать вероятность принадлежности к кластеру и, таким образом, решить задачу кластеризации. Такая задача&lt;br /&gt;
называется задачей разделения смеси распределений:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
p(x) = \sum_{j=1}^{k}w_jp_j(x),\quad p_j(x) = \phi(\theta_j; x),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;\theta_j&amp;lt;/math&amp;gt; — параметры распределения &amp;lt;math&amp;gt;p_j(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае смести гауссовых распределений предполагается, что все компоненты имеют многомерное нормальное распределение. То есть в случае &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства признаков &amp;lt;math&amp;gt;\phi(\theta_j; x)&amp;lt;/math&amp;gt; имеют следующий вид:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \phi(\theta_j; x) = \frac{1}{\Big(2\pi\Big)^{\frac{q}{2}}\sqrt{|\Sigma_j|}}\exp{\bigg\{-\frac{\delta^2}{2}\bigg\} },\\ &lt;br /&gt;
&amp;amp; \delta^2 = \Big( x - \mu_j \Big)^T \Sigma_j^{-1} \Big( x - \mu_j \Big),&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где:&lt;br /&gt;
* &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; — ковариационная матрица размером &amp;lt;math&amp;gt;q \times q&amp;lt;/math&amp;gt;,&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерный вектор математических ожиданий,&lt;br /&gt;
* &amp;lt;math&amp;gt;\delta^2&amp;lt;/math&amp;gt; — квадратичное расстояние Махаланобиса.&lt;br /&gt;
В случае смеси гауссовых распределений получаем, что &amp;lt;math&amp;gt;\theta_j = (\mu_j, \Sigma_j)&amp;lt;/math&amp;gt;. То есть для решения задачи разделения смеси гауссовых распределений необходимо оценить вектор параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;. Согласно принципу максимизации правдоподобия:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
w, \theta = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{p(x_i)} = \underset{w, \theta}{\operatorname{argmax}} \sum_{i=1}^{n}\ln{\sum_{j=1}^{k}w_jp_j(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Таким образом, имеет место задача максимизации суммы логарифмов сумм, решение которой представляет большую трудность. В таком случае полезным оказывается итеративный метод решения — EM-алгоритм.&amp;lt;ref&amp;gt;Поиск структуры в данных — Lecture 9 — Expectation Maximization (EM-алгоритм) [https://www.coursera.org/learn/unsupervised-learning/lecture/2jhbI/expectation-maximization-em-alghoritm www.coursera.org]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EM-алгоритм ====&lt;br /&gt;
Оптимальные параметры задачи разделения смеси гауссовых распределений отыскиваются последовательно с помощью итерационного EM-алгоритма. Основная идея – вводится вспомогательный вектор скрытых переменных. Это позволяет свести сложную оптимизационную задачу к последовательности итераций по пересчету коэффициентов (скрытых переменных по текущему приближению вектора параметров - E-шаг) и максимизации правдоподобия (с целью найти следующее приближение вектора - М-шаг).&amp;lt;ref&amp;gt;EM алгоритм (пример) [http://www.machinelearning.ru/wiki/index.php?title=EM_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80) www.machinelearning.ru]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм заключается в следующем:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; В начале работы алгоритма задаются параметры начального приближения. Наиболее общим способом инициализации является присвоение элементам матрицы математических ожиданий случайных значений &amp;lt;math&amp;gt; \mu_j \leftarrow Random &amp;lt;/math&amp;gt;, начальные ковариационные матрицы определяются как единчиные &amp;lt;math&amp;gt;\Sigma_j \leftarrow I&amp;lt;/math&amp;gt;, веса кластеров задаются одинаковыми &amp;lt;math&amp;gt;w_i \leftarrow \frac{1}{k}&amp;lt;/math&amp;gt;. Также в качестве начальных параметров можно использовать результат работы алгоритма K-means. (Данная эвристика применяется, так как K-means требуется намного меньше итераций до достижения стабилизации, в то время как каждый шаг EM требует больших вычислительных затрат).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;E-шаг: используя текущее значение вектора параметров &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt;, вычисляем значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; y_{ij} = \frac{w_j p_j(x_i)}{\sum_{l=1}^{k}w_lp_l(x_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;М-шаг: переоценка вектора параметров, используя текущие значения скрытых переменных:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; n_j = \sum_{i = 1}^{n}y_{ij}, \\&lt;br /&gt;
&amp;amp; \mu_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}x_i, \\&lt;br /&gt;
&amp;amp; \Sigma_j^{new} = \frac{1}{n_j} \sum_{i = 1}^{n}y_{ij}(x_i - \mu_j^{new})(x_i - \mu_j^{new})^T,\\&lt;br /&gt;
&amp;amp; w_j^{new} = \frac{n_j}{n}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Итерации происходят до сходимости (норма разности векторов скрытых переменных или изменение логарифмического правдоподобия на каждой итерации не будет превышать заданную константу) или достижения максимального числа итераций.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
В вычислительное ядро EM-алгоритма входят:&lt;br /&gt;
* Вычисление скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге (всего их &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Переоценка вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге, используя текущие значения скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; на E-шаге и обновление вектора параметров &amp;lt;math&amp;gt;(w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; на M-шаге.&lt;br /&gt;
Также стоит выделить вычисление определителя и обратной матрицы ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; в начале E-шага.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательная реализация алгоритма EM может быть проиллюстрирована с помощью следующего псевдокода:&lt;br /&gt;
# &#039;&#039;&#039;Инициализация&#039;&#039;&#039;: установка начальных значений &amp;lt;math&amp;gt;\mu, \, \Sigma_j \, (j = \overline{1, k}), \, w&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;Пока&#039;&#039;&#039; изменение логарифмического правдоподобия &amp;lt;math&amp;gt;\Delta llh \geq \epsilon&amp;lt;/math&amp;gt; и не достигнуто максимальное число итераций &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &#039;&#039;&#039;выполнять&#039;&#039;&#039; шаги E и M.&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; E-step:&lt;br /&gt;
     &#039;&#039;&#039;Инициализировать&#039;&#039;&#039; нулевыми значениями &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}, \, llh&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &#039;&#039;&#039;Вычислить&#039;&#039;&#039; определитель и обратную матрицу матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;sump_i = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\delta_{ij} = \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{\delta^2}{2}\big\} }&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;sump_i \mathrel{+}= g_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;y_i = \frac{g_i}{sump_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;llh \mathrel{+}= \ln(sump_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu^{&#039;} \mathrel{+}= x_iy_i^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;w^{&#039;} \mathrel{+}= y_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;def&#039;&#039;&#039; M-step:&lt;br /&gt;
     &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;:&lt;br /&gt;
         &amp;lt;math&amp;gt;\mu_j = \frac{\mu_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
         &#039;&#039;&#039;for&#039;&#039;&#039; &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;\Sigma_j^{&#039;} \mathrel{+}= (x_i - \mu_j)y_{ij}(x_i - \mu_j)^T&amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;\Sigma_j = \frac{\Sigma_j^{&#039;}}{w_j^{&#039;}}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;w = \frac{w^{&#039;}}{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
Логаририфмическое правдоподобие вычисляется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
llh=\sum_{i=1}^{n}\ln{(sump_i)}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Матрицы &amp;lt;math&amp;gt;\mu^{&#039;}, \, \Sigma_j^{&#039;} \, (j = \overline{1, k}), \, w^{&#039;}&amp;lt;/math&amp;gt; являются временными и используются только для вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Последовательная сложность одной итерации EM-алгоритма:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; E-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;) методом Гаусса-Жордана: &amp;lt;math&amp;gt;O(kq^3)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Определителей ковариационных матриц &amp;lt;math&amp;gt;|\Sigma_j|&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Матриц, обратных ковариационным матрицам &amp;lt;math&amp;gt;\Sigma_j^{-1}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(kq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i = \overline{1, n}, j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность E-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
М-шаг: &amp;lt;br&amp;gt;&lt;br /&gt;
В случае недиагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
В случае диагональных ковариационных матриц сложность вычислений:&lt;br /&gt;
* Обновление математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* Обновление весов кластеров &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;j = \overline{1, k}&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;O(nk)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Получаем, что последовательная сложность М-шага в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Таким образом, последовательная сложность итерации EM-алгоритма в случае недиагональных ковариационных матриц имеет порядок &amp;lt;math&amp;gt;O(kq^3 + nkq^2)&amp;lt;/math&amp;gt;, а в случае диагональных ковариационных матриц — &amp;lt;math&amp;gt;O(nkq)&amp;lt;/math&amp;gt;. При этом, обычно размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, также как и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), поэтому в случае недиагональных ковариационных матриц сложность может быть записана в виде &amp;lt;math&amp;gt;O(nkq^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма в терминах E-шагов и M-шагов представлен на рис. 1. Каждая итерация алгоритма зависит от результата работы предыдущей итерации, M-шаг зависит от результата E-шага.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-Lavrushkin.png|thumb|1000px|center|Рисунок 1. Граф EM-алгоритма. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; — множество наблюдений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица с вероятностями членства в кластерах.]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим по отдельности информационные графы E-шага и M-шага.&lt;br /&gt;
&lt;br /&gt;
==== E-шаг ====&lt;br /&gt;
Опишем граф E-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению обратных матриц и определителей ковариационных матриц. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению &amp;lt;math&amp;gt;g_{ij} = \frac{w_j}{{2 \pi}^\frac{q}{2}|\Sigma_j|}\exp{\big\{-\frac{1}{2}  \big( x_i - \mu_j \big)^T \Sigma_j^{-1} \big( x_i - \mu_j \big)  \big\}}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются вес кластера &amp;lt;math&amp;gt;w_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;, ковариационная матрица &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;, элемент выборки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;\sum_{l=1}^{k}g_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Аргументами этой операции являются значения &amp;lt;math&amp;gt;g_{ij}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению скрытых переменных &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;. Аргументами этой операции являются значение &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; и нормировочный коэффициент. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.2 и рис.3. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:E-step-Lavrushkin.png|thumb|1000px|center|Рисунок 2. Граф E-шага.]]&lt;br /&gt;
[[Файл:E-step2-Lavrushkin.png|thumb|800px|center|Рисунок 3. Граф E-шага с с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==== M-шаг ====&lt;br /&gt;
Опишем граф M-шага как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин:&lt;br /&gt;
*&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин соответствует вычислению нормировочных коэффициентов &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;. Результат срабатывания операции является промежуточным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин соответствует вычислению математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин соответствует вычислению ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументами этой операции являются множество наблюдений &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, скрытые переменные &amp;lt;math&amp;gt;y_{ij}, \, i = \overline{1, n}&amp;lt;/math&amp;gt;, нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;, математическое ожидание &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
*&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа вершин соответствует вычислению весов кластеров &amp;lt;math&amp;gt;w_{j}&amp;lt;/math&amp;gt;. Число вершин: &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. Аргументом этой операции является нормировочный коэффициент &amp;lt;math&amp;gt;n_j&amp;lt;/math&amp;gt;. Результат срабатывания операции является выходным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф представлен на рис.4 и рис.5. Здесь вершины одной группы расположены в одной строке. Вершины-операции обозначены синим цветом, вершины-данные — оранжевым.&lt;br /&gt;
&lt;br /&gt;
[[Файл:M-step-Lavrushkin.png|thumb|1000px|center|Рисунок 4. Граф M-шага.]]&lt;br /&gt;
[[Файл:M-step2-Lavrushkin.png|thumb|600px|center|Рисунок 5. Граф M-шага с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
Графы вычисления математических ожиданий &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt; и ковариационных матриц &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt; представлены на рис. 6 и рис. 7.&lt;br /&gt;
&lt;br /&gt;
[[Файл:EM-alg-mean-Lavrushkin.png|thumb|1400px|center|Рисунок 6. Граф вычисления математического ожидания &amp;lt;math&amp;gt;\mu_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
[[Файл:EM-alg-cov-Lavrushkin.png|thumb|1400px|center|Рисунок 7. Граф вычисления ковариационной матрицы &amp;lt;math&amp;gt;\Sigma_j&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
По графам из пункта 1.7 видно, что скрытые переменные &amp;lt;math&amp;gt;y_{ij}&amp;lt;/math&amp;gt; в E-шаге, &amp;lt;math&amp;gt;y_{ij}x_i&amp;lt;/math&amp;gt; в вычислении математических ожиданий &amp;lt;math&amp;gt;\mu_{j}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y_{ij}(x_i - \mu_j)(x_i - \mu_j)&amp;lt;/math&amp;gt; в вычислении ковариационных матриц &amp;lt;math&amp;gt;\Sigma_{j}&amp;lt;/math&amp;gt; в M-шаге вычисляются независимо (&amp;lt;math&amp;gt;i = \overline{1, n}, \, j = \overline{1, k}&amp;lt;/math&amp;gt;). Таким образом, при условии наличия неограниченного числа процессоров эти операции можно распараллелить как по числу наблюдений, так и по числу кластеров. Однако в отсутствии неограниченного числа процессорв целесообразно проводить распараллеливание по числу наблюдений, потому что, как правило, число наблюдений значительно больше числа кластеров  (&amp;lt;math&amp;gt;n \gg q&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(nk)&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;k&amp;lt;/math&amp;gt; — число кластеров; &amp;lt;math&amp;gt;X =\{x_{1}, x_{2}, ..., x_{n}\}&amp;lt;/math&amp;gt; — множество из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; наблюдений &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;-мерного пространства.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;nq + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;(w, \theta) = (w_1, ..., w_k; \mu_1, ..., \mu_k; \Sigma_1, ..., \Sigma_k)&amp;lt;/math&amp;gt; — параметры смеси гауссовых распределений; &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — матрица размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt; с вероятностями членства в кластерах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k(n + q^2 + q + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Число итераций до сходимости метода зависит от начального приближения и выбранного критерия останова.&lt;br /&gt;
&lt;br /&gt;
Предположим, что размерность элементов выборки &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; и число кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; значительно меньше числа элементов выборки &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;k \ll n, q \ll n&amp;lt;/math&amp;gt;), а число итераций до сходимости метода равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Тогда вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, имеет порядок &amp;lt;math&amp;gt;O\bigg(\frac{kq^2}{q + k}m\bigg)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Достоинства и недостатки алгоритма ====&lt;br /&gt;
Среди достоинств EM-алгоритма можно выделить следующие:&lt;br /&gt;
* Мощная статистическая основа.&lt;br /&gt;
* Линейное увеличение сложности при росте объема данных.&lt;br /&gt;
* Устойчивость к шумам и пропускам в данных.&lt;br /&gt;
* Возможность построения желаемого числа кластеров.&lt;br /&gt;
* Быстрая сходимость при удачной инициализации.&lt;br /&gt;
К недостаткам EM-алгоритма можно отнести следующее:&lt;br /&gt;
* Алгоритм неустойчив по начальным данным (то есть тем, которые инициализируют вектор параметров на первой итерации), так как он находит локальный экстремум, значение которого может оказаться гораздо ниже, чем глобальный максимум. В зависимости от выбора начального приближения алгоритм может сходиться к разным точкам. Также может сильно варьироваться скорость сходимости.&lt;br /&gt;
* Алгоритм не позволяет определять количество &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; компонент смеси. Эта величина является структурным параметром алгоритма.&lt;br /&gt;
* Предположение о нормальности всех измерений данных не всегда выполняется.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV];&lt;br /&gt;
# [http://arma.sourceforge.net/docs.html#gmm_diag Armadillo] — OpenMP реализация с предположением диагональности ковариационных матриц;&lt;br /&gt;
# [http://www.mlpack.org/docs/mlpack-git/doxygen.php?doc=classmlpack_1_1gmm_1_1GMM.html MLPack];&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html scikit-learn];&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab];&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MultiGPU CUDA реализация №1];&lt;br /&gt;
# [http://andrewharp.com/gmmcuda CUDA реализация №2].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergey Lavrushkin</name></author>
	</entry>
</feed>