<?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=Noite</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=Noite"/>
	<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/Noite"/>
	<updated>2026-10-23T05:54:27Z</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:Noite&amp;diff=18569</id>
		<title>Участник:Noite</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:Noite&amp;diff=18569"/>
		<updated>2016-11-20T09:08:26Z</updated>

		<summary type="html">&lt;p&gt;Noite: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;студент группы 628 ВМК МГУ Зинченко Дмитрий Александрович&lt;/div&gt;</summary>
		<author><name>Noite</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Noite&amp;diff=17517</id>
		<title>Обсуждение участника:Noite</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Noite&amp;diff=17517"/>
		<updated>2016-11-16T02:35:11Z</updated>

		<summary type="html">&lt;p&gt;Noite: /* Замечания к Участник:Noite/EM-алгоритм_кластеризации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Замечания к [[Участник:Noite/EM-алгоритм_кластеризации]] ==&lt;br /&gt;
&lt;br /&gt;
1) лишняя строка &amp;quot;Алгоритм кластеризации, основанный на максимизации ожидания (EM-алгоритм)&amp;quot; перед содержанием --- убрано&lt;br /&gt;
&lt;br /&gt;
2) отсутствует оценка высоты и ширины ЯПФ параллельного алгоритма во врезке в начале статьи --- врезка исправлена&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ниже - замечания второго рецензента&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
3) Во врезке так и не появилась информация по поводу параллельного алгоритма --- исправлено&lt;br /&gt;
&lt;br /&gt;
4) Из содержания нужно убрать ссылку [5] --- имеется ввиду из заголовка раздела? или подобную ссылку вообще нельзя использовать? пока ссылка перенесена из заголовка внутрь раздела&lt;br /&gt;
&lt;br /&gt;
5) В формулировке задачи в п1.1 нет разъяснения параметра m --- формулировка задачи кластеризации изменена&lt;br /&gt;
&lt;br /&gt;
6) В п1.2 парметры m, n, k почему-то превратились в M, N, K --- параметры m,n,k изменены в п1.1 и во врезке на M,N,K соответственно&lt;br /&gt;
&lt;br /&gt;
7) П 1.5. Как инициализируются скрытые переменные gamma? Выравнивание псевдокода местами нарушено. Слово &amp;quot;большУю&amp;quot; - здесь лучше использовать значок ударения --- слово большУю исправлено. Скрытые переменные могут быть инициализированы любым образом, поскольку первый E-шаг алгоритма их в любом случае перезапишет. Выравнивание псевдокода изменено.&lt;br /&gt;
&lt;br /&gt;
8) П 1.7 Информационный граф: на рисунке омега превратилась в w, гамма - в Y. --- в используемом редакторе изображений для гаммы использовался следующий символ: γ - символ гамма, взятый из википедии. То, что он похож на Y - визуальное совпадение. &lt;br /&gt;
&lt;br /&gt;
9)П 1.9 Выходные данные - сказано о векторе n. Поясните, какое значение он имеет в терминах алгоритма кластеризации. --- пояснение добавлено&lt;/div&gt;</summary>
		<author><name>Noite</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Noite&amp;diff=17497</id>
		<title>Обсуждение участника:Noite</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Noite&amp;diff=17497"/>
		<updated>2016-11-15T21:55:34Z</updated>

		<summary type="html">&lt;p&gt;Noite: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Замечания к [[Участник:Noite/EM-алгоритм_кластеризации]] ==&lt;br /&gt;
&lt;br /&gt;
1) лишняя строка &amp;quot;Алгоритм кластеризации, основанный на максимизации ожидания (EM-алгоритм)&amp;quot; перед содержанием --- убрано&lt;br /&gt;
&lt;br /&gt;
2) отсутствует оценка высоты и ширины ЯПФ параллельного алгоритма во врезке в начале статьи --- врезка исправлена&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ниже - замечания второго рецензента&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
3) Во врезке так и не появилась информация по поводу параллельного алгоритма --- исправлено&lt;br /&gt;
&lt;br /&gt;
4) Из содержания нужно убрать ссылку [5] --- имеется ввиду из заголовка раздела? или подобную ссылку вообще нельзя использовать? пока ссылка перенесена из заголовка внутрь раздела&lt;br /&gt;
&lt;br /&gt;
5) В формулировке задачи в п1.1 нет разъяснения параметра m --- формулировка задачи кластеризации изменена&lt;br /&gt;
&lt;br /&gt;
6) В п1.2 парметры m, n, k почему-то превратились в M, N, K --- параметры m,n,k изменены в п1.1 и во врезке на M,N,K соответственно&lt;br /&gt;
&lt;br /&gt;
7) П 1.5. Как инициализируются скрытые переменные gamma? Выравнивание псевдокода местами нарушено. Слово &amp;quot;большУю&amp;quot; - здесь лучше использовать значок ударения --- слово большУю исправлено. Скрытые переменные могут быть инициализированы любым образом, поскольку первый E-шаг алгоритма их в любом случае перезапишет. Выравнивание псевдокода изменено.&lt;br /&gt;
&lt;br /&gt;
8) П 1.7 Информационный граф: на рисунке омега превратилась в w, гамма - в Y. --- в используемом редакторе изображений для гаммы использовался следующий символ: γ - символ гамма, взятый из википедии. То, что он похож на Y - визуальное совпадение. &lt;br /&gt;
*Почему-то пока обновленные версии файлов некорректно отображаются на странице&lt;br /&gt;
&lt;br /&gt;
9)П 1.9 Выходные данные - сказано о векторе n. Поясните, какое значение он имеет в терминах алгоритма кластеризации. --- пояснение добавлено&lt;/div&gt;</summary>
		<author><name>Noite</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Noite&amp;diff=17496</id>
		<title>Обсуждение участника:Noite</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Noite&amp;diff=17496"/>
		<updated>2016-11-15T21:50:42Z</updated>

		<summary type="html">&lt;p&gt;Noite: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Замечания к [[Участник:Noite/EM-алгоритм_кластеризации]] ==&lt;br /&gt;
&lt;br /&gt;
1) лишняя строка &amp;quot;Алгоритм кластеризации, основанный на максимизации ожидания (EM-алгоритм)&amp;quot; перед содержанием --- убрано&lt;br /&gt;
&lt;br /&gt;
2) отсутствует оценка высоты и ширины ЯПФ параллельного алгоритма во врезке в начале статьи --- врезка исправлена&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ниже - замечания второго рецензента&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
3) Во врезке так и не появилась информация по поводу параллельного алгоритма --- исправлено&lt;br /&gt;
&lt;br /&gt;
4) Из содержания нужно убрать ссылку [5] --- имеется ввиду из заголовка раздела? или подобную ссылку вообще нельзя использовать? пока ссылка перенесена из заголовка внутрь раздела&lt;br /&gt;
&lt;br /&gt;
5) В формулировке задачи в п1.1 нет разъяснения параметра m --- формулировка задачи кластеризации изменена&lt;br /&gt;
&lt;br /&gt;
6) В п1.2 парметры m, n, k почему-то превратились в M, N, K --- параметры m,n,k изменены в п1.1 и во врезке на M,N,K соответственно&lt;br /&gt;
&lt;br /&gt;
7) П 1.5. Как инициализируются скрытые переменные gamma? Выравнивание псевдокода местами нарушено. Слово &amp;quot;большУю&amp;quot; - здесь лучше использовать значок ударения --- слово большУю исправлено. Скрытые переменные могут быть инициализированы любым образом, поскольку первый E-шаг алгоритма их в любом случае перезапишет. Выравнивание псевдокода изменено.&lt;br /&gt;
&lt;br /&gt;
8) П 1.7 Информационный граф: на рисунке омега превратилась в w, гамма - в Y. --- в используемом редакторе изображений для гаммы использовался следующий символ: γ - символ гамма, взятый из википедии. То, что он похож на Y - визуальное совпадение.&lt;br /&gt;
&lt;br /&gt;
9)П 1.9 Выходные данные - сказано о векторе n. Поясните, какое значение он имеет в терминах алгоритма кластеризации. --- пояснение добавлено&lt;/div&gt;</summary>
		<author><name>Noite</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Noite&amp;diff=17495</id>
		<title>Обсуждение участника:Noite</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Noite&amp;diff=17495"/>
		<updated>2016-11-15T21:49:19Z</updated>

		<summary type="html">&lt;p&gt;Noite: /* Замечания к Участник:Noite/EM-алгоритм_кластеризации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Замечания к [[Участник:Noite/EM-алгоритм_кластеризации]] ==&lt;br /&gt;
&lt;br /&gt;
1) лишняя строка &amp;quot;Алгоритм кластеризации, основанный на максимизации ожидания (EM-алгоритм)&amp;quot; перед содержанием --- убрано&lt;br /&gt;
&lt;br /&gt;
2) отсутствует оценка высоты и ширины ЯПФ параллельного алгоритма во врезке в начале статьи --- врезка исправлена&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ниже - замечания второго рецензента&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
3) Во врезке так и не появилась информация по поводу параллельного алгоритма --- исправлено&lt;br /&gt;
&lt;br /&gt;
4) Из содержания нужно убрать ссылку [5] --- имеется ввиду из заголовка раздела? или подобную ссылку вообще нельзя использовать? пока ссылка перенесена из заголовка внутрь раздела&lt;br /&gt;
&lt;br /&gt;
5) В формулировке задачи в п1.1 нет разъяснения параметра m --- формулировка задачи кластеризации изменена&lt;br /&gt;
&lt;br /&gt;
6) В п1.2 парметры m, n, k почему-то превратились в M, N, K --- параметры m,n,k изменены в п1.1 и во врезке на M,N,K соответственно&lt;br /&gt;
&lt;br /&gt;
7) П 1.5. Как инициализируются скрытые переменные gamma? Выравнивание псевдокода местами нарушено. Слово &amp;quot;большУю&amp;quot; - здесь лучше использовать значок ударения --- слово большУю исправлено. Скрытые переменные могут быть инициализированы любым образом, поскольку первый E-шаг алгоритма их в любом случае перезапишет. Выравнивание псевдокода изменено.&lt;br /&gt;
&lt;br /&gt;
8) П 1.7 Информационный граф: на рисунке омега превратилась в w, гамма - в Y. --- в используемом редакторе изображений для гаммы использовался следующий символ: γ. То, что он похож на Y - визуальное совпадение.&lt;br /&gt;
&lt;br /&gt;
9)П 1.9 Выходные данные - сказано о векторе n. Поясните, какое значение он имеет в терминах алгоритма кластеризации. --- пояснение добавлено&lt;/div&gt;</summary>
		<author><name>Noite</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:Noite/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=17487</id>
		<title>Участник:Noite/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:Noite/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=17487"/>
		<updated>2016-11-15T21:26:57Z</updated>

		<summary type="html">&lt;p&gt;Noite: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(iter * N * M^2 * K)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;N * M + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(iter * M^2 * K)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(iter * N)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Noite|Зинченко Д.А.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
В задачах оптимизации EM-алгоритмом называют итеративную процедуру поиска численного значения экстремума какой-либо функции. В частности, в статистике этот алгоритм используется для оценки максимального правдоподобия. Впервые название EM-алгоритм было предложено в 1977 году&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;, однако его идеи были описаны и раньше&amp;lt;ref name=korolev&amp;gt;В.Ю.Королёв. ЕМ-алгоритм, его модификации и их применение к задаче разделения смесей вероятностных распределений.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм применяется для решения задач двух типов &amp;lt;ref name=korolev/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Анализ неполных данных (данных с пропусками). &lt;br /&gt;
# Оценка максимального правдоподобия в случае, если функцию правдоподобия трудно исследовать аналитически. В этом случае введение набора скрытых переменных может существенно упростить задачу.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к задачам второго типа. В данной статье рассматривается следующая постановка задачи кластеризации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;Дано множество из N объектов, каждый из которых представляет собой точку в M-мерном метрическом пространстве. Каждому измерению пространства соответствует некоторое свойство объекта. Необходимо разбить это множество на K подмножеств (кластеров) так, чтобы, чтобы элементы каждого подмножества существенно отличались по свойствам от элементов других подмножеств.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование алгоритма EM подразумевает следующее &#039;&#039;предположение об объектах&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Пусть объекты, которые необходимо разбить на кластеры, появляются случайным образом и независимо друг от друга согласно вероятностному распределению, равному смеси (линейной комбинации) распределений кластеров. В данной статье в дальнейшем будет считаться, что распределение каждого кластера является многомерным нормальным распределением с произвольной матрицей ковариации - наиболее часто используемое предположение.&lt;br /&gt;
&lt;br /&gt;
Тогда каждый объект принадлежит каждому кластеру, но с разной вероятностью. EM-алгоритм итеративно оценивает параметры распределений кластеров, максимизируя логарифмическую функцию максимального правдоподобия. После окончания работы алгоритма объект будет отнесен к кластеру, вероятность принадлежности которому максимальна. Вводимый набор скрытых переменных для каждого объекта - вероятности того, что объект принадлежит каждому из кластеров.&lt;br /&gt;
&lt;br /&gt;
Итерация алгоритма состоит из двух последовательных шагов.&lt;br /&gt;
&lt;br /&gt;
# (Expectation) Вычисляются новые ожидаемые значения скрытых переменных.&lt;br /&gt;
# (Maximization) Решается задача максимизации правдоподобия: По текущим значениям скрытых переменных обновляются параметры распределений для кластеров: математическое ожидание, дисперсия и вероятность появления объектов из кластера.&lt;br /&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;N&amp;lt;/math&amp;gt; - количество объектов, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - количество параметров объекта&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\gamma_{n,k}&amp;lt;/math&amp;gt; - значения скрытых переменных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N_{k}&amp;lt;/math&amp;gt; - количество элементов отнесенных к кластеру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{1},...,x_N&amp;lt;/math&amp;gt; - объекты&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Параметры распределений:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{1},...,w_{K}&amp;lt;/math&amp;gt; - вероятности появления объектов из кластеров (веса кластеров), &amp;lt;math&amp;gt;\sum_{k=1}^Kw_{k}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{1},...,\mu_{K}&amp;lt;/math&amp;gt; - центры гауссиан кластеров&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma_{1},...,\Sigma_{K}&amp;lt;/math&amp;gt; - матрицы ковариации гауссиан кластеров, каждая матрица имеет размерность &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Смесь распределений:&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; P(x) = \sum_{j=1}^Kw_jp(x|\mu_{j}, \Sigma_{j})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Цель алгоритма - вычислить параметры распределений, максимизирующих логарифм функции правдоподобия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\ln P(x|w,\mu,\Sigma)= \sum_{n=1}^N \ln \{ \sum_{k=1}^K w_{k}p(x_{n}|\mu_{k},\Sigma_{k})\}&amp;lt;/math&amp;gt;.&amp;lt;/center&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
* В начале работы алгоритма задаются параметры начального приближения:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{i} = 1/K, \mu_{i} = random(x_{j}), i=1..K, j=1..N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{j,j}^{k}=\frac{1}{NK}\sum_{i=1}^N(x_{i,j} - \mu_{k,j})^2, k=1..K, j=1..M&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Поскольку от начального приближения может сильно зависеть результат работы алгоритма, вместо инициализации кластеров случайными центрами, равными весами и диагональными матрицами ковариации, как в приведенных формулах, часто применяют другие способы (подробнее - в [[#Особенности реализации последовательного алгоритма | особенностях реализации]])&#039;&#039;&lt;br /&gt;
* Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
** E-шаг: используя текущее значение параметров &amp;lt;math&amp;gt;w_{1},...,w_{k};\mu_{1},...,\mu_{k};\Sigma^{1},...,\Sigma^{k}&amp;lt;/math&amp;gt;, вычисляем значение вектора скрытых переменных &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\gamma_{n,k}=\frac{w_{k}p(x_{n}|\mu_{k},\Sigma^{k})}{\sum_{j=1}^K w_{j}p(x_{n}|\mu_{j},\Sigma^{j})}, &amp;lt;/math&amp;gt; знаменатель дроби - нормировочный коэффициент&amp;lt;/center&amp;gt;&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p(x|\mu,\Sigma)=\frac{1}{{(2\pi)}^{\frac{N}{2}}\sqrt{|\Sigma|}}exp\biggl\{-\frac{1}{2}{(x-\mu)}^T{\Sigma}^{-1}(x-\mu)\biggr\}&amp;lt;/math&amp;gt; - плотность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерного нормального распределения&amp;lt;/center&amp;gt;&lt;br /&gt;
** М-шаг: переоценка параметров по текущим значениям скрытых переменных для &amp;lt;math&amp;gt;k = 1..K&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\mu^{new}_{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k}x_{n}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{new}^{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k} (x_{n}-\mu_{k}^{new})(x_{n}-\mu_{k}^{new})^{T}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{k}^{new}=\frac{N_{k}}{N}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;N_{k}=\sum_{n=1}^N \gamma_{n,k}&amp;lt;/math&amp;gt;.&amp;lt;/center&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;
Вычислительное ядро алгоритма состоит из двух шагов, повторяющихся каждую итерацию:&lt;br /&gt;
*Обновление скрытых переменных на основе текущих параметров распределений&lt;br /&gt;
*Обновление параметров кластеров: весов, центров и матриц ковариации&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании вычислительного ядра алгоритма]], основную часть алгоритма составляют итеративно проводимые макрооперации: Expectation шаг - вычисление новых значений скрытых переменных, Maximization шаг - обновление параметров кластеров. Макроструктура алгоритма представлена на рисунке 1:&lt;br /&gt;
[[file:EM_macro.png|thumb|center|600px|Рисунок 1: Макроструктура EM-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Примерная схема реализации EM алгоритма с предварительной обработкой матриц ковариации:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Инициализировать веса и центры кластеров;&lt;br /&gt;
Инициализировать матрицы ковариации;&lt;br /&gt;
&lt;br /&gt;
// Основной цикл&lt;br /&gt;
Пока условие остановки не выполнено&lt;br /&gt;
    // E-шаг&lt;br /&gt;
    В цикле для каждого кластера&lt;br /&gt;
        Вычислить определитель матрицы ковариации Sigma;&lt;br /&gt;
        Вычислить обратную матрицу матрице Sigma;&lt;br /&gt;
    В цикле для каждого объекта&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Вычислить и запомнить p(x | mu, Sigma) для текущего объекта и кластера;&lt;br /&gt;
        Просуммировать вычисленные p(x | mu, Sigma);&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Обновить скрытые переменные gamma;&lt;br /&gt;
    // M-шаг&lt;br /&gt;
    Обновить веса w;&lt;br /&gt;
    Обновить центры кластеров mu;&lt;br /&gt;
    Обновить матрицы ковариации Sigma;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления определителя произвольной матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления матрицы, обратной произвольной матрице ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации - &amp;lt;math&amp;gt;O(K * M^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С учетом заранее вычисленных определителей и обратных матриц сложность вычисления &amp;lt;math&amp;gt;p(x | \mu,\Sigma)&amp;lt;/math&amp;gt; составит: &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага E составит &amp;lt;math&amp;gt;O(N * M^2 * K + K * M^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления весов кластеров &amp;lt;math&amp;gt;O(K * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления центров кластеров &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления одной матрицы ковариации &amp;lt;math&amp;gt;O(N * M)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления всех матриц ковариации &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага M алгоритма - &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит &amp;lt;math&amp;gt;O(K * M^2 * N + K * M^3 + K * M * N)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В предположении, что размерность объектов много меньше их количества &amp;lt;math&amp;gt;M &amp;lt;&amp;lt; N&amp;lt;/math&amp;gt; получим сложность итерации &amp;lt;math&amp;gt;O(K * M^2 * N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большу́ю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее - вынесены за основной цикл шага E&amp;lt;ref name=ParallelEMComparissonGraphLab&amp;gt;Henggang Cui, Jinliang Wei, Wei Dai. Parallel Implementation of Expectation-Maximization for Fast Convergence - School of Computer Science, Carnegie Mellon University. [https://users.ece.cmu.edu/~hengganc/archive/report/final.pdf]&amp;lt;/ref&amp;gt;. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм&amp;lt;ref&amp;gt;Вячеслав Орешков. EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а суммарная сложность шага E и сложность всей итерации составит &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Макроструктура алгоритма представлена на рисунке 1 (см. [[#Макроструктура алгоритма|раздел 1.4]] статьи).&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 представлена схема вычислений E-шага алгоритма для одного объекта: для объекта &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и параметров &amp;lt;math&amp;gt;w_{j}, \mu_{j}, \Sigma_{j}, j=1..K&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются ненормированные значения скрытых переменных &amp;lt;math&amp;gt;g_{j}&amp;lt;/math&amp;gt;, нормировочный коэффициент &#039;&#039;normСoeff&#039;&#039;, и получаются итоговые значения &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step.png|thumb|center|400px|Рисунок 2: E-шаг EM алгоритма для одного объекта]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 представлена схема вычислений E-шага алгоритма для всех объектов: для объекта &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt; и параметров-векторов &amp;lt;math&amp;gt;w, \mu, \Sigma&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются значения скрытых переменных. &amp;lt;math&amp;gt;E_{i}, i=1..N&amp;lt;/math&amp;gt; - маркооперации, E-шаги для соответствующих объектов.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step_all.png|thumb|center|400px|Рисунок 3: E-шаг EM алгоритма для всех объектов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена схема вычислений M-шага алгоритма для одного кластера: для объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и скрытых переменных &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;, соответствующих степени принадлежности этих объектов кластеру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, согласно формулам шага M [[#Математическое описание алгоритма|раздела 1.2]] вычисляется нормировочный коэффициент &amp;lt;math&amp;gt;N_{j}&amp;lt;/math&amp;gt; и параметры этого кластера: вес &amp;lt;math&amp;gt;w_{j}^{new}&amp;lt;/math&amp;gt;, матрица ковариации &amp;lt;math&amp;gt;\Sigma_{j}^{new}&amp;lt;/math&amp;gt; и центр кластера &amp;lt;math&amp;gt;\mu_{j}^{new}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step.png|thumb|center|400px|Рисунок 4: M-шаг EM алгоритма для одного кластера]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена схема вычислений M-шага алгоритма для всех кластеров. &amp;lt;math&amp;gt;M_{j}, j=1..K&amp;lt;/math&amp;gt; соответствует макрооперации - M-шагу для соответствующего кластера и скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step_all.png|thumb|center|400px|Рисунок 5: M-шаг EM алгоритма для всех кластеров]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Из схем вычислений шагов E и M шагов алгоритма, приведенным в [[#Информационный граф|предыдущем разделе]], видно, что если размерность матрицы ковариации небольшая (тогда вычисление определителя и обратной матрицы матрице ковариации не является трудоемкой операцией), обе макрооперации EM алгоритма можно распараллеливать как по кластерам, так и по объектам.&lt;br /&gt;
&lt;br /&gt;
Как правило количество кластеров, на которые нужно разбить объекты, несравнимо меньше количества объектов, поэтому распараллеливание в большинстве существующих реализаций происходит по объектам: обработка объектов по возможности равномерно распределяются по кластерам. Теоретически (если считать передачу данных между процессорами мгновенной) при наличии неограниченного числа процессоров сложность алгоритма составит &amp;lt;math&amp;gt;O(M^2 * K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* Целое неотрицательное число &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
* Значения координат объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов с &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; координатами каждый.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;N * M&amp;lt;/math&amp;gt; вещественных чисел (если координаты объектов - вещественные числа), &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целое неотрицательное число.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор длины &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - для каждого объекта указан номер кластера, к которому он отнесен. Объект относится по результатам работы алгоритма тому кластеру, вероятность принадлежности которому (значение соответствующей скрытой переменной) максимальна.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; целых неотрицательных чисел.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
=== Преимущества и недостатки ===&lt;br /&gt;
EM-алгоритм обладает следующими преимуществами и недостатками&amp;lt;ref&amp;gt;EM алгоритм, его модификации и обобщения. machinelearning.ru [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]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Преимущества:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Слабо чувствителен к выбросам&lt;br /&gt;
# Прост в реализации&lt;br /&gt;
# Быстро сходится при удачном выборе начальных значений параметров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Неустойчив к выбору начальных значений параметров - от них зависит как скорость сходимости, так и результат работы: алгоритм может сойтись к локальному экстремуму функции правдоподобия, который может быть существенно ниже глобального.&lt;br /&gt;
# Алгоритм не находит оптимальное количество кластеров. Количество кластеров, на которые нужно разбить множество объектов, является параметром алгоритма.&lt;br /&gt;
# При большой размерности пространства объектов выдвинутое предположение о модели их распределения может быть некорректным.&lt;br /&gt;
&lt;br /&gt;
=== Влияние структуры матрицы ковариации на форму кластера ===&lt;br /&gt;
&lt;br /&gt;
[[file:DifferentCovariance.png|thumb|center|800px|Рисунок 6: Влияние структуры матрицы ковариации на форму кластеров для двумерного случая. a) - матрицы ковариации являются диагональными, b) - матрицы ковариации произвольны. &amp;lt;ref&amp;gt;Mathworks: Clustering Using Gaussian Mixture Models [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 6 наглядно показывает, что при диагональной форме матриц ковариации полуоси эллипса (в общем случае - эллипсоида), соответствующего распределению объектов, отнесенных кластеру, параллельны осям координат объектов. В противном случае полуоси могут располагаться произвольным образом.&lt;br /&gt;
&lt;br /&gt;
=== Общие свойства ===&lt;br /&gt;
[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] EM алгоритма равна &amp;lt;math&amp;gt;M * K * it&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - размерность объекта, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, а &amp;lt;math&amp;gt;it&amp;lt;/math&amp;gt; - количество итераций. &lt;br /&gt;
&lt;br /&gt;
EM-алгоритм является итерационным, и число итераций в общем случае не фиксировано: оно зависит от условий остановки, начальных приближений и расположения объектов. Поэтому этот алгоритм &#039;&#039;недетерминированный&#039;&#039;. По тем же причинам EM-алгоритм является &#039;&#039;неустойчивым&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
=== Инициализация параметров распределений ===&lt;br /&gt;
Наиболее распространены 3 способа инициализации центров распределений для EM алгоритма:&lt;br /&gt;
# центр распределения совпадает со случайно выбранным объектом &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
# все наблюдения распределяются по кластерам случайным образом, а затем для каждого кластера пересчитывается цент соответствующего распределения&lt;br /&gt;
# центры кластеров получаются в результате работы алгоритма k-means. Использование такой инициализации оправдано тем, что k-means требует меньших вычислительных затрат и быстрее сходится&amp;lt;ref&amp;gt;EM алгоритм (пример) machinelearning.ru [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])&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Многие статьи&amp;lt;ref name=FREERIDE&amp;gt;Leonid Glimcher, Gagan Agrawal. Parallelising EM Algorithm on a Cluster of SMPs [http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CV&amp;gt;López-de-Teruel P. E., García J. M., Acacio; The Parallel EM Algorithm and its Applications in Computer Vision [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=MULTITHREAD&amp;gt;Sharon X. Lee, Kaleb L. Leemaqz, Geoffrey J. McLachlan. A simple multithreaded implementation of the EM algorithm for mixture models [https://arxiv.org/pdf/1606.02054.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CUDA&amp;gt;Araújo, G.F., H.T. Macedo, M.T. Chella, C.A.E. Montesco and M.V.O. Medeiros. PARALLEL IMPLEMENTATION OF EXPECTATION-MAXIMISATION ALGORITHM FOR THE TRAINING OF GAUSSIAN MIXTURE MODELS [https://ri.ufs.br/bitstream/123456789/1764/1/ExpectationMaximisationAlgorithm.pdf]&amp;lt;/ref&amp;gt;, в которых представлены параллельные реализации EM алгоритма, описывают помимо использующихся программных и аппаратных решений результаты проведенных экспериментов с данными. В качестве примера в этом разделе будут рассмотрены результаты эксперементов, проведенных со связующим программным обеспечением (&#039;&#039;middleware&#039;&#039;) FREERIDE&amp;lt;ref&amp;gt;Leonid Glimchera, Ruoming Jinb, Gagan Agrawala. Middleware for data mining applications on clusters and grids [http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf]&amp;lt;/ref&amp;gt; (FRamework for Rapid Implementation of Datamining Engines), обеспечивающим возможность распараллеливания как для систем с общей памятью (в частности, симметричных мультипроцессорных систем), так и для систем с распределенной памятью.&lt;br /&gt;
&lt;br /&gt;
Эксперименты проводились на кластере машин Pentium 700MHz связанных при помощи Myrinet&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Myrinet&amp;lt;/ref&amp;gt; LANai 7.0 на трех наборах данных: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;а)&#039;&#039;&#039; 3.3 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; 6.2 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; 12.5 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
Объекты представляют собой координаты точек 10-мерного пространства.&lt;br /&gt;
 &lt;br /&gt;
Количество машин в кластере варьировалось от 1 до 8, при этом на каждой машине запускалось до четырех параллельных потоков.&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов представлены на рисунках 7-9&amp;lt;ref name=FREERIDE/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_a.png|thumb|center|350px|Рисунок 7: набор данных a)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_b.png|thumb|center|357px|Рисунок 8: набор данных b)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_c.png|thumb|center|351px|Рисунок 9: набор данных c)]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что используемые в данном исследовании машины, как и коммуникационная среда, сейчас не используются и считаются устаревшими, результат приведенных экспериментов наглядно показывает, что EM алгоритм хорошо параллелится, зависимость ускорения от числа узлов в кластере с небольшим количеством узлов близка к линейной, а также, что скорость работы алгоритма линейно зависит от числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Данный раздел может быть дополнен&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Примеры библиотек, содержащих последовательную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV(C++)] ([https://github.com/opencv/opencv/blob/master/modules/ml/src/em.cpp github])&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab]&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html Scikit learn (Python)]&lt;br /&gt;
# [http://mlpack.org/index.html MLPack(C++)]&lt;br /&gt;
&lt;br /&gt;
Примеры библиотек, содержащих параллельную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Здесь приводятся как конкретные реализации, так и статьи, описывающие подходы к реализациям распараллеливания EM-алгоритма&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# [https://spark.apache.org/ Apache Spark]&lt;br /&gt;
# [http://accord-framework.net/ Accord.NET Framework (C#)]&lt;br /&gt;
# Статья об использовании FREERIDE middleware для распараллеливания EM алгоритма &amp;lt;ref name=FREERIDE/&amp;gt; &lt;br /&gt;
# [http://andrewharp.com/gmmcuda реализация с использованием CUDA]&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MPI еще одна реализация с использованием CUDA]&lt;br /&gt;
# статья об использовании параллельного EM алгоритма в задачах компьютерного зрения &amp;lt;ref name=CV/&amp;gt;&lt;br /&gt;
# статья о распараллеливании EM алгоритма с использованием CUDA &amp;lt;ref name=CUDA/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Noite</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:Noite/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=17485</id>
		<title>Участник:Noite/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:Noite/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=17485"/>
		<updated>2016-11-15T21:26:43Z</updated>

		<summary type="html">&lt;p&gt;Noite: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(iter * N * M^2 * K)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;N * M + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(iter * M^2 * K)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(iter * N)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Noite|Зинченко Д.А.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
В задачах оптимизации EM-алгоритмом называют итеративную процедуру поиска численного значения экстремума какой-либо функции. В частности, в статистике этот алгоритм используется для оценки максимального правдоподобия. Впервые название EM-алгоритм было предложено в 1977 году&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;, однако его идеи были описаны и раньше&amp;lt;ref name=korolev&amp;gt;В.Ю.Королёв. ЕМ-алгоритм, его модификации и их применение к задаче разделения смесей вероятностных распределений.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм применяется для решения задач двух типов &amp;lt;ref name=korolev/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Анализ неполных данных (данных с пропусками). &lt;br /&gt;
# Оценка максимального правдоподобия в случае, если функцию правдоподобия трудно исследовать аналитически. В этом случае введение набора скрытых переменных может существенно упростить задачу.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к задачам второго типа. В данной статье рассматривается следующая постановка задачи кластеризации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;Дано множество из N объектов, каждый из которых представляет собой точку в M-мерном метрическом пространстве. Каждому измерению пространства соответствует некоторое свойство объекта. Необходимо разбить это множество на K подмножеств (кластеров) так, чтобы, чтобы элементы каждого подмножества существенно отличались по свойствам от элементов других подмножеств.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование алгоритма EM подразумевает следующее &#039;&#039;предположение об объектах&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Пусть объекты, которые необходимо разбить на кластеры, появляются случайным образом и независимо друг от друга согласно вероятностному распределению, равному смеси (линейной комбинации) распределений кластеров. В данной статье в дальнейшем будет считаться, что распределение каждого кластера является многомерным нормальным распределением с произвольной матрицей ковариации - наиболее часто используемое предположение.&lt;br /&gt;
&lt;br /&gt;
Тогда каждый объект принадлежит каждому кластеру, но с разной вероятностью. EM-алгоритм итеративно оценивает параметры распределений кластеров, максимизируя логарифмическую функцию максимального правдоподобия. После окончания работы алгоритма объект будет отнесен к кластеру, вероятность принадлежности которому максимальна. Вводимый набор скрытых переменных для каждого объекта - вероятности того, что объект принадлежит каждому из кластеров.&lt;br /&gt;
&lt;br /&gt;
Итерация алгоритма состоит из двух последовательных шагов.&lt;br /&gt;
&lt;br /&gt;
# (Expectation) Вычисляются новые ожидаемые значения скрытых переменных.&lt;br /&gt;
# (Maximization) Решается задача максимизации правдоподобия: По текущим значениям скрытых переменных обновляются параметры распределений для кластеров: математическое ожидание, дисперсия и вероятность появления объектов из кластера.&lt;br /&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;N&amp;lt;/math&amp;gt; - количество объектов, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - количество параметров объекта&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\gamma_{n,k}&amp;lt;/math&amp;gt; - значения скрытых переменных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N_{k}&amp;lt;/math&amp;gt; - количество элементов отнесенных к кластеру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{1},...,x_N&amp;lt;/math&amp;gt; - объекты&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Параметры распределений:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{1},...,w_{K}&amp;lt;/math&amp;gt; - вероятности появления объектов из кластеров (веса кластеров), &amp;lt;math&amp;gt;\sum_{k=1}^Kw_{k}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{1},...,\mu_{K}&amp;lt;/math&amp;gt; - центры гауссиан кластеров&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma_{1},...,\Sigma_{K}&amp;lt;/math&amp;gt; - матрицы ковариации гауссиан кластеров, каждая матрица имеет размерность &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Смесь распределений:&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; P(x) = \sum_{j=1}^Kw_jp(x|\mu_{j}, \Sigma_{j})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Цель алгоритма - вычислить параметры распределений, максимизирующих логарифм функции правдоподобия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\ln P(x|w,\mu,\Sigma)= \sum_{n=1}^N \ln \{ \sum_{k=1}^K w_{k}p(x_{n}|\mu_{k},\Sigma_{k})\}&amp;lt;/math&amp;gt;.&amp;lt;/center&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
* В начале работы алгоритма задаются параметры начального приближения:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{i} = 1/K, \mu_{i} = random(x_{j}), i=1..K, j=1..N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{j,j}^{k}=\frac{1}{NK}\sum_{i=1}^N(x_{i,j} - \mu_{k,j})^2, k=1..K, j=1..M&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Поскольку от начального приближения может сильно зависеть результат работы алгоритма, вместо инициализации кластеров случайными центрами, равными весами и диагональными матрицами ковариации, как в приведенных формулах, часто применяют другие способы (подробнее - в [[#Особенности реализации последовательного алгоритма | особенностях реализации]])&#039;&#039;&lt;br /&gt;
* Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
** E-шаг: используя текущее значение параметров &amp;lt;math&amp;gt;w_{1},...,w_{k};\mu_{1},...,\mu_{k};\Sigma^{1},...,\Sigma^{k}&amp;lt;/math&amp;gt;, вычисляем значение вектора скрытых переменных &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\gamma_{n,k}=\frac{w_{k}p(x_{n}|\mu_{k},\Sigma^{k})}{\sum_{j=1}^K w_{j}p(x_{n}|\mu_{j},\Sigma^{j})}, &amp;lt;/math&amp;gt; знаменатель дроби - нормировочный коэффициент&amp;lt;/center&amp;gt;&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p(x|\mu,\Sigma)=\frac{1}{{(2\pi)}^{\frac{N}{2}}\sqrt{|\Sigma|}}exp\biggl\{-\frac{1}{2}{(x-\mu)}^T{\Sigma}^{-1}(x-\mu)\biggr\}&amp;lt;/math&amp;gt; - плотность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерного нормального распределения&amp;lt;/center&amp;gt;&lt;br /&gt;
** М-шаг: переоценка параметров по текущим значениям скрытых переменных для &amp;lt;math&amp;gt;k = 1..K&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\mu^{new}_{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k}x_{n}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{new}^{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k} (x_{n}-\mu_{k}^{new})(x_{n}-\mu_{k}^{new})^{T}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{k}^{new}=\frac{N_{k}}{N}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;N_{k}=\sum_{n=1}^N \gamma_{n,k}&amp;lt;/math&amp;gt;.&amp;lt;/center&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;
Вычислительное ядро алгоритма состоит из двух шагов, повторяющихся каждую итерацию:&lt;br /&gt;
*Обновление скрытых переменных на основе текущих параметров распределений&lt;br /&gt;
*Обновление параметров кластеров: весов, центров и матриц ковариации&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании вычислительного ядра алгоритма]], основную часть алгоритма составляют итеративно проводимые макрооперации: Expectation шаг - вычисление новых значений скрытых переменных, Maximization шаг - обновление параметров кластеров. Макроструктура алгоритма представлена на рисунке 1:&lt;br /&gt;
[[file:EM_macro.png|thumb|center|600px|Рисунок 1: Макроструктура EM-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Примерная схема реализации EM алгоритма с предварительной обработкой матриц ковариации:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Инициализировать веса и центры кластеров;&lt;br /&gt;
Инициализировать матрицы ковариации;&lt;br /&gt;
&lt;br /&gt;
// Основной цикл&lt;br /&gt;
Пока условие остановки не выполнено&lt;br /&gt;
    // E-шаг&lt;br /&gt;
    В цикле для каждого кластера&lt;br /&gt;
        Вычислить определитель матрицы ковариации Sigma;&lt;br /&gt;
        Вычислить обратную матрицу матрице Sigma;&lt;br /&gt;
    В цикле для каждого объекта&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Вычислить и запомнить p(x | mu, Sigma) для текущего объекта и кластера;&lt;br /&gt;
        Просуммировать вычисленные p(x | mu, Sigma);&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Обновить скрытые переменные gamma;&lt;br /&gt;
    // M-шаг&lt;br /&gt;
    Обновить веса w;&lt;br /&gt;
    Обновить центры кластеров mu;&lt;br /&gt;
    Обновить матрицы ковариации Sigma;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления определителя произвольной матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления матрицы, обратной произвольной матрице ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации - &amp;lt;math&amp;gt;O(K * M^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С учетом заранее вычисленных определителей и обратных матриц сложность вычисления &amp;lt;math&amp;gt;p(x | \mu,\Sigma)&amp;lt;/math&amp;gt; составит: &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага E составит &amp;lt;math&amp;gt;O(N * M^2 * K + K * M^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления весов кластеров &amp;lt;math&amp;gt;O(K * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления центров кластеров &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления одной матрицы ковариации &amp;lt;math&amp;gt;O(N * M)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления всех матриц ковариации &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага M алгоритма - &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит &amp;lt;math&amp;gt;O(K * M^2 * N + K * M^3 + K * M * N)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В предположении, что размерность объектов много меньше их количества &amp;lt;math&amp;gt;M &amp;lt;&amp;lt; N&amp;lt;/math&amp;gt; получим сложность итерации &amp;lt;math&amp;gt;O(K * M^2 * N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большу́ю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее - вынесены за основной цикл шага E&amp;lt;ref name=ParallelEMComparissonGraphLab&amp;gt;Henggang Cui, Jinliang Wei, Wei Dai. Parallel Implementation of Expectation-Maximization for Fast Convergence - School of Computer Science, Carnegie Mellon University. [https://users.ece.cmu.edu/~hengganc/archive/report/final.pdf]&amp;lt;/ref&amp;gt;. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм&amp;lt;ref&amp;gt;Вячеслав Орешков. EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а суммарная сложность шага E и сложность всей итерации составит &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Макроструктура алгоритма представлена на рисунке 1 (см. [[#Макроструктура алгоритма|раздел 1.4]] статьи).&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 представлена схема вычислений E-шага алгоритма для одного объекта: для объекта &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и параметров &amp;lt;math&amp;gt;w_{j}, \mu_{j}, \Sigma_{j}, j=1..K&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются ненормированные значения скрытых переменных &amp;lt;math&amp;gt;g_{j}&amp;lt;/math&amp;gt;, нормировочный коэффициент &#039;&#039;normСoeff&#039;&#039;, и получаются итоговые значения &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 представлена схема вычислений E-шага алгоритма для всех объектов: для объекта &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt; и параметров-векторов &amp;lt;math&amp;gt;w, \mu, \Sigma&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются значения скрытых переменных. &amp;lt;math&amp;gt;E_{i}, i=1..N&amp;lt;/math&amp;gt; - маркооперации, E-шаги для соответствующих объектов.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step_all.png|thumb|center|400px|Рисунок 3: E-шаг EM алгоритма для всех объектов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена схема вычислений M-шага алгоритма для одного кластера: для объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и скрытых переменных &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;, соответствующих степени принадлежности этих объектов кластеру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, согласно формулам шага M [[#Математическое описание алгоритма|раздела 1.2]] вычисляется нормировочный коэффициент &amp;lt;math&amp;gt;N_{j}&amp;lt;/math&amp;gt; и параметры этого кластера: вес &amp;lt;math&amp;gt;w_{j}^{new}&amp;lt;/math&amp;gt;, матрица ковариации &amp;lt;math&amp;gt;\Sigma_{j}^{new}&amp;lt;/math&amp;gt; и центр кластера &amp;lt;math&amp;gt;\mu_{j}^{new}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step.png|thumb|center|400px|Рисунок 4: M-шаг EM алгоритма для одного кластера]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена схема вычислений M-шага алгоритма для всех кластеров. &amp;lt;math&amp;gt;M_{j}, j=1..K&amp;lt;/math&amp;gt; соответствует макрооперации - M-шагу для соответствующего кластера и скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step_all.png|thumb|center|400px|Рисунок 5: M-шаг EM алгоритма для всех кластеров]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Из схем вычислений шагов E и M шагов алгоритма, приведенным в [[#Информационный граф|предыдущем разделе]], видно, что если размерность матрицы ковариации небольшая (тогда вычисление определителя и обратной матрицы матрице ковариации не является трудоемкой операцией), обе макрооперации EM алгоритма можно распараллеливать как по кластерам, так и по объектам.&lt;br /&gt;
&lt;br /&gt;
Как правило количество кластеров, на которые нужно разбить объекты, несравнимо меньше количества объектов, поэтому распараллеливание в большинстве существующих реализаций происходит по объектам: обработка объектов по возможности равномерно распределяются по кластерам. Теоретически (если считать передачу данных между процессорами мгновенной) при наличии неограниченного числа процессоров сложность алгоритма составит &amp;lt;math&amp;gt;O(M^2 * K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* Целое неотрицательное число &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
* Значения координат объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов с &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; координатами каждый.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;N * M&amp;lt;/math&amp;gt; вещественных чисел (если координаты объектов - вещественные числа), &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целое неотрицательное число.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор длины &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - для каждого объекта указан номер кластера, к которому он отнесен. Объект относится по результатам работы алгоритма тому кластеру, вероятность принадлежности которому (значение соответствующей скрытой переменной) максимальна.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; целых неотрицательных чисел.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
=== Преимущества и недостатки ===&lt;br /&gt;
EM-алгоритм обладает следующими преимуществами и недостатками&amp;lt;ref&amp;gt;EM алгоритм, его модификации и обобщения. machinelearning.ru [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]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Преимущества:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Слабо чувствителен к выбросам&lt;br /&gt;
# Прост в реализации&lt;br /&gt;
# Быстро сходится при удачном выборе начальных значений параметров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Неустойчив к выбору начальных значений параметров - от них зависит как скорость сходимости, так и результат работы: алгоритм может сойтись к локальному экстремуму функции правдоподобия, который может быть существенно ниже глобального.&lt;br /&gt;
# Алгоритм не находит оптимальное количество кластеров. Количество кластеров, на которые нужно разбить множество объектов, является параметром алгоритма.&lt;br /&gt;
# При большой размерности пространства объектов выдвинутое предположение о модели их распределения может быть некорректным.&lt;br /&gt;
&lt;br /&gt;
=== Влияние структуры матрицы ковариации на форму кластера ===&lt;br /&gt;
&lt;br /&gt;
[[file:DifferentCovariance.png|thumb|center|800px|Рисунок 6: Влияние структуры матрицы ковариации на форму кластеров для двумерного случая. a) - матрицы ковариации являются диагональными, b) - матрицы ковариации произвольны. &amp;lt;ref&amp;gt;Mathworks: Clustering Using Gaussian Mixture Models [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 6 наглядно показывает, что при диагональной форме матриц ковариации полуоси эллипса (в общем случае - эллипсоида), соответствующего распределению объектов, отнесенных кластеру, параллельны осям координат объектов. В противном случае полуоси могут располагаться произвольным образом.&lt;br /&gt;
&lt;br /&gt;
=== Общие свойства ===&lt;br /&gt;
[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] EM алгоритма равна &amp;lt;math&amp;gt;M * K * it&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - размерность объекта, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, а &amp;lt;math&amp;gt;it&amp;lt;/math&amp;gt; - количество итераций. &lt;br /&gt;
&lt;br /&gt;
EM-алгоритм является итерационным, и число итераций в общем случае не фиксировано: оно зависит от условий остановки, начальных приближений и расположения объектов. Поэтому этот алгоритм &#039;&#039;недетерминированный&#039;&#039;. По тем же причинам EM-алгоритм является &#039;&#039;неустойчивым&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
=== Инициализация параметров распределений ===&lt;br /&gt;
Наиболее распространены 3 способа инициализации центров распределений для EM алгоритма:&lt;br /&gt;
# центр распределения совпадает со случайно выбранным объектом &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
# все наблюдения распределяются по кластерам случайным образом, а затем для каждого кластера пересчитывается цент соответствующего распределения&lt;br /&gt;
# центры кластеров получаются в результате работы алгоритма k-means. Использование такой инициализации оправдано тем, что k-means требует меньших вычислительных затрат и быстрее сходится&amp;lt;ref&amp;gt;EM алгоритм (пример) machinelearning.ru [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])&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Многие статьи&amp;lt;ref name=FREERIDE&amp;gt;Leonid Glimcher, Gagan Agrawal. Parallelising EM Algorithm on a Cluster of SMPs [http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CV&amp;gt;López-de-Teruel P. E., García J. M., Acacio; The Parallel EM Algorithm and its Applications in Computer Vision [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=MULTITHREAD&amp;gt;Sharon X. Lee, Kaleb L. Leemaqz, Geoffrey J. McLachlan. A simple multithreaded implementation of the EM algorithm for mixture models [https://arxiv.org/pdf/1606.02054.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CUDA&amp;gt;Araújo, G.F., H.T. Macedo, M.T. Chella, C.A.E. Montesco and M.V.O. Medeiros. PARALLEL IMPLEMENTATION OF EXPECTATION-MAXIMISATION ALGORITHM FOR THE TRAINING OF GAUSSIAN MIXTURE MODELS [https://ri.ufs.br/bitstream/123456789/1764/1/ExpectationMaximisationAlgorithm.pdf]&amp;lt;/ref&amp;gt;, в которых представлены параллельные реализации EM алгоритма, описывают помимо использующихся программных и аппаратных решений результаты проведенных экспериментов с данными. В качестве примера в этом разделе будут рассмотрены результаты эксперементов, проведенных со связующим программным обеспечением (&#039;&#039;middleware&#039;&#039;) FREERIDE&amp;lt;ref&amp;gt;Leonid Glimchera, Ruoming Jinb, Gagan Agrawala. Middleware for data mining applications on clusters and grids [http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf]&amp;lt;/ref&amp;gt; (FRamework for Rapid Implementation of Datamining Engines), обеспечивающим возможность распараллеливания как для систем с общей памятью (в частности, симметричных мультипроцессорных систем), так и для систем с распределенной памятью.&lt;br /&gt;
&lt;br /&gt;
Эксперименты проводились на кластере машин Pentium 700MHz связанных при помощи Myrinet&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Myrinet&amp;lt;/ref&amp;gt; LANai 7.0 на трех наборах данных: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;а)&#039;&#039;&#039; 3.3 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; 6.2 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; 12.5 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
Объекты представляют собой координаты точек 10-мерного пространства.&lt;br /&gt;
 &lt;br /&gt;
Количество машин в кластере варьировалось от 1 до 8, при этом на каждой машине запускалось до четырех параллельных потоков.&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов представлены на рисунках 7-9&amp;lt;ref name=FREERIDE/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_a.png|thumb|center|350px|Рисунок 7: набор данных a)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_b.png|thumb|center|357px|Рисунок 8: набор данных b)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_c.png|thumb|center|351px|Рисунок 9: набор данных c)]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что используемые в данном исследовании машины, как и коммуникационная среда, сейчас не используются и считаются устаревшими, результат приведенных экспериментов наглядно показывает, что EM алгоритм хорошо параллелится, зависимость ускорения от числа узлов в кластере с небольшим количеством узлов близка к линейной, а также, что скорость работы алгоритма линейно зависит от числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Данный раздел может быть дополнен&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Примеры библиотек, содержащих последовательную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV(C++)] ([https://github.com/opencv/opencv/blob/master/modules/ml/src/em.cpp github])&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab]&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html Scikit learn (Python)]&lt;br /&gt;
# [http://mlpack.org/index.html MLPack(C++)]&lt;br /&gt;
&lt;br /&gt;
Примеры библиотек, содержащих параллельную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Здесь приводятся как конкретные реализации, так и статьи, описывающие подходы к реализациям распараллеливания EM-алгоритма&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# [https://spark.apache.org/ Apache Spark]&lt;br /&gt;
# [http://accord-framework.net/ Accord.NET Framework (C#)]&lt;br /&gt;
# Статья об использовании FREERIDE middleware для распараллеливания EM алгоритма &amp;lt;ref name=FREERIDE/&amp;gt; &lt;br /&gt;
# [http://andrewharp.com/gmmcuda реализация с использованием CUDA]&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MPI еще одна реализация с использованием CUDA]&lt;br /&gt;
# статья об использовании параллельного EM алгоритма в задачах компьютерного зрения &amp;lt;ref name=CV/&amp;gt;&lt;br /&gt;
# статья о распараллеливании EM алгоритма с использованием CUDA &amp;lt;ref name=CUDA/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Noite</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Noite&amp;diff=17478</id>
		<title>Обсуждение участника:Noite</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Noite&amp;diff=17478"/>
		<updated>2016-11-15T21:12:29Z</updated>

		<summary type="html">&lt;p&gt;Noite: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Замечания к [[Участник:Noite/EM-алгоритм_кластеризации]] ==&lt;br /&gt;
&lt;br /&gt;
1) лишняя строка &amp;quot;Алгоритм кластеризации, основанный на максимизации ожидания (EM-алгоритм)&amp;quot; перед содержанием --- убрано&lt;br /&gt;
&lt;br /&gt;
2) отсутствует оценка высоты и ширины ЯПФ параллельного алгоритма во врезке в начале статьи --- врезка исправлена&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ниже - замечания второго рецензента&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
3) Во врезке так и не появилась информация по поводу параллельного алгоритма --- исправлено&lt;br /&gt;
&lt;br /&gt;
4) Из содержания нужно убрать ссылку [5] --- имеется ввиду из заголовка раздела? или подобную ссылку вообще нельзя использовать? пока ссылка перенесена из заголовка внутрь раздела&lt;br /&gt;
&lt;br /&gt;
5) В формулировке задачи в п1.1 нет разъяснения параметра m --- формулировка задачи кластеризации изменена&lt;br /&gt;
&lt;br /&gt;
6) В п1.2 парметры m, n, k почему-то превратились в M, N, K --- параметры m,n,k изменены в п1.1 и во врезке на M,N,K соответственно (пока исправлено не полностью, нужно поправить в диаграммах)&lt;br /&gt;
&lt;br /&gt;
7) П 1.5. Как инициализируются скрытые переменные gamma? Выравнивание псевдокода местами нарушено. Слово &amp;quot;большУю&amp;quot; - здесь лучше использовать значок ударения --- слово большУю исправлено. Скрытые переменные могут быть инициализированы любым образом, поскольку первый E-шаг алгоритма их в любом случае перезапишет. Выравнивание псевдокода изменено.&lt;br /&gt;
&lt;br /&gt;
8) П 1.7 Информационный граф: на рисунке омега превратилась в w, гамма - в Y. --- в используемом редакторе изображений для гаммы использовался следующий символ: γ. То, что он похож на Y - визуальное совпадение. (w пока не исправлено) &lt;br /&gt;
&lt;br /&gt;
9)П 1.9 Выходные данные - сказано о векторе n. Поясните, какое значение он имеет в терминах алгоритма кластеризации. --- пояснение добавлено&lt;/div&gt;</summary>
		<author><name>Noite</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Noite&amp;diff=17477</id>
		<title>Обсуждение участника:Noite</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Noite&amp;diff=17477"/>
		<updated>2016-11-15T21:12:05Z</updated>

		<summary type="html">&lt;p&gt;Noite: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Замечания к [[Участник:Noite/EM-алгоритм_кластеризации]] ==&lt;br /&gt;
&lt;br /&gt;
1) лишняя строка &amp;quot;Алгоритм кластеризации, основанный на максимизации ожидания (EM-алгоритм)&amp;quot; перед содержанием --- убрано&lt;br /&gt;
&lt;br /&gt;
2) отсутствует оценка высоты и ширины ЯПФ параллельного алгоритма во врезке в начале статьи --- врезка исправлена&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ниже - замечания второго рецензента&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
3) Во врезке так и не появилась информация по поводу параллельного алгоритма - исправлено&lt;br /&gt;
&lt;br /&gt;
4) Из содержания нужно убрать ссылку [5] --- имеется ввиду из заголовка раздела? или подобную ссылку вообще нельзя использовать? пока ссылка перенесена из заголовка внутрь раздела&lt;br /&gt;
&lt;br /&gt;
5) В формулировке задачи в п1.1 нет разъяснения параметра m --- формулировка задачи кластеризации изменена&lt;br /&gt;
&lt;br /&gt;
6) В п1.2 парметры m, n, k почему-то превратились в M, N, K --- параметры m,n,k изменены в п1.1 и во врезке на M,N,K соответственно (пока исправлено не полностью, нужно поправить в диаграммах)&lt;br /&gt;
&lt;br /&gt;
7) П 1.5. Как инициализируются скрытые переменные gamma? Выравнивание псевдокода местами нарушено. Слово &amp;quot;большУю&amp;quot; - здесь лучше использовать значок ударения --- слово большУю исправлено. Скрытые переменные могут быть инициализированы любым образом, поскольку первый E-шаг алгоритма их в любом случае перезапишет. Выравнивание псевдокода изменено.&lt;br /&gt;
&lt;br /&gt;
8) П 1.7 Информационный граф: на рисунке омега превратилась в w, гамма - в Y. --- в используемом редакторе изображений для гаммы использовался следующий символ: γ. То, что он похож на Y - визуальное совпадение. (w пока не исправлено) &lt;br /&gt;
&lt;br /&gt;
9)П 1.9 Выходные данные - сказано о векторе n. Поясните, какое значение он имеет в терминах алгоритма кластеризации. --- пояснение добавлено&lt;/div&gt;</summary>
		<author><name>Noite</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:Noite/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=17476</id>
		<title>Участник:Noite/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:Noite/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=17476"/>
		<updated>2016-11-15T21:11:28Z</updated>

		<summary type="html">&lt;p&gt;Noite: исправление врезки&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(iter * N * M^2 * K)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;N * M + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(iter * M^2 * K)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(iter * N)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Noite|Зинченко Д.А.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
В задачах оптимизации EM-алгоритмом называют итеративную процедуру поиска численного значения экстремума какой-либо функции. В частности, в статистике этот алгоритм используется для оценки максимального правдоподобия. Впервые название EM-алгоритм было предложено в 1977 году&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;, однако его идеи были описаны и раньше&amp;lt;ref name=korolev&amp;gt;В.Ю.Королёв. ЕМ-алгоритм, его модификации и их применение к задаче разделения смесей вероятностных распределений.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм применяется для решения задач двух типов &amp;lt;ref name=korolev/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Анализ неполных данных (данных с пропусками). &lt;br /&gt;
# Оценка максимального правдоподобия в случае, если функцию правдоподобия трудно исследовать аналитически. В этом случае введение набора скрытых переменных может существенно упростить задачу.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к задачам второго типа. В данной статье рассматривается следующая постановка задачи кластеризации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;Дано множество из N объектов, каждый из которых представляет собой точку в M-мерном метрическом пространстве. Каждому измерению пространства соответствует некоторое свойство объекта. Необходимо разбить это множество на K подмножеств (кластеров) так, чтобы, чтобы элементы каждого подмножества существенно отличались по свойствам от элементов других подмножеств.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование алгоритма EM подразумевает следующее &#039;&#039;предположение об объектах&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Пусть объекты, которые необходимо разбить на кластеры, появляются случайным образом и независимо друг от друга согласно вероятностному распределению, равному смеси (линейной комбинации) распределений кластеров. В данной статье в дальнейшем будет считаться, что распределение каждого кластера является многомерным нормальным распределением с произвольной матрицей ковариации - наиболее часто используемое предположение.&lt;br /&gt;
&lt;br /&gt;
Тогда каждый объект принадлежит каждому кластеру, но с разной вероятностью. EM-алгоритм итеративно оценивает параметры распределений кластеров, максимизируя логарифмическую функцию максимального правдоподобия. После окончания работы алгоритма объект будет отнесен к кластеру, вероятность принадлежности которому максимальна. Вводимый набор скрытых переменных для каждого объекта - вероятности того, что объект принадлежит каждому из кластеров.&lt;br /&gt;
&lt;br /&gt;
Итерация алгоритма состоит из двух последовательных шагов.&lt;br /&gt;
&lt;br /&gt;
# (Expectation) Вычисляются новые ожидаемые значения скрытых переменных.&lt;br /&gt;
# (Maximization) Решается задача максимизации правдоподобия: По текущим значениям скрытых переменных обновляются параметры распределений для кластеров: математическое ожидание, дисперсия и вероятность появления объектов из кластера.&lt;br /&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;N&amp;lt;/math&amp;gt; - количество объектов, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - количество параметров объекта&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\gamma_{n,k}&amp;lt;/math&amp;gt; - значения скрытых переменных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N_{k}&amp;lt;/math&amp;gt; - количество элементов отнесенных к кластеру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{1},...,x_N&amp;lt;/math&amp;gt; - объекты&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Параметры распределений:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{1},...,w_{K}&amp;lt;/math&amp;gt; - вероятности появления объектов из кластеров (веса кластеров), &amp;lt;math&amp;gt;\sum_{k=1}^Kw_{k}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{1},...,\mu_{K}&amp;lt;/math&amp;gt; - центры гауссиан кластеров&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma_{1},...,\Sigma_{K}&amp;lt;/math&amp;gt; - матрицы ковариации гауссиан кластеров, каждая матрица имеет размерность &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Смесь распределений:&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; P(x) = \sum_{j=1}^Kw_jp(x|\mu_{j}, \Sigma_{j})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Цель алгоритма - вычислить параметры распределений, максимизирующих логарифм функции правдоподобия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\ln P(x|w,\mu,\Sigma)= \sum_{n=1}^N \ln \{ \sum_{k=1}^K w_{k}p(x_{n}|\mu_{k},\Sigma_{k})\}&amp;lt;/math&amp;gt;.&amp;lt;/center&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
* В начале работы алгоритма задаются параметры начального приближения:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{i} = 1/K, \mu_{i} = random(x_{j}), i=1..K, j=1..N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{j,j}^{k}=\frac{1}{NK}\sum_{i=1}^N(x_{i,j} - \mu_{k,j})^2, k=1..K, j=1..M&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Поскольку от начального приближения может сильно зависеть результат работы алгоритма, вместо инициализации кластеров случайными центрами, равными весами и диагональными матрицами ковариации, как в приведенных формулах, часто применяют другие способы (подробнее - в [[#Особенности реализации последовательного алгоритма | особенностях реализации]])&#039;&#039;&lt;br /&gt;
* Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
** E-шаг: используя текущее значение параметров &amp;lt;math&amp;gt;w_{1},...,w_{k};\mu_{1},...,\mu_{k};\Sigma^{1},...,\Sigma^{k}&amp;lt;/math&amp;gt;, вычисляем значение вектора скрытых переменных &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\gamma_{n,k}=\frac{w_{k}p(x_{n}|\mu_{k},\Sigma^{k})}{\sum_{j=1}^K w_{j}p(x_{n}|\mu_{j},\Sigma^{j})}, &amp;lt;/math&amp;gt; знаменатель дроби - нормировочный коэффициент&amp;lt;/center&amp;gt;&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p(x|\mu,\Sigma)=\frac{1}{{(2\pi)}^{\frac{N}{2}}\sqrt{|\Sigma|}}exp\biggl\{-\frac{1}{2}{(x-\mu)}^T{\Sigma}^{-1}(x-\mu)\biggr\}&amp;lt;/math&amp;gt; - плотность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерного нормального распределения&amp;lt;/center&amp;gt;&lt;br /&gt;
** М-шаг: переоценка параметров по текущим значениям скрытых переменных для &amp;lt;math&amp;gt;k = 1..K&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\mu^{new}_{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k}x_{n}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{new}^{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k} (x_{n}-\mu_{k}^{new})(x_{n}-\mu_{k}^{new})^{T}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{k}^{new}=\frac{N_{k}}{N}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;N_{k}=\sum_{n=1}^N \gamma_{n,k}&amp;lt;/math&amp;gt;.&amp;lt;/center&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;
Вычислительное ядро алгоритма состоит из двух шагов, повторяющихся каждую итерацию:&lt;br /&gt;
*Обновление скрытых переменных на основе текущих параметров распределений&lt;br /&gt;
*Обновление параметров кластеров: весов, центров и матриц ковариации&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании вычислительного ядра алгоритма]], основную часть алгоритма составляют итеративно проводимые макрооперации: Expectation шаг - вычисление новых значений скрытых переменных, Maximization шаг - обновление параметров кластеров. Макроструктура алгоритма представлена на рисунке 1:&lt;br /&gt;
[[file:EM_macro.png|thumb|center|600px|Рисунок 1: Макроструктура EM-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Примерная схема реализации EM алгоритма с предварительной обработкой матриц ковариации:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Инициализировать веса и центры кластеров;&lt;br /&gt;
Инициализировать матрицы ковариации;&lt;br /&gt;
&lt;br /&gt;
// Основной цикл&lt;br /&gt;
Пока условие остановки не выполнено&lt;br /&gt;
    // E-шаг&lt;br /&gt;
    В цикле для каждого кластера&lt;br /&gt;
        Вычислить определитель матрицы ковариации Sigma;&lt;br /&gt;
        Вычислить обратную матрицу матрице Sigma;&lt;br /&gt;
    В цикле для каждого объекта&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Вычислить и запомнить p(x | mu, Sigma) для текущего объекта и кластера;&lt;br /&gt;
        Просуммировать вычисленные p(x | mu, Sigma);&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Обновить скрытые переменные gamma;&lt;br /&gt;
    // M-шаг&lt;br /&gt;
    Обновить веса w;&lt;br /&gt;
    Обновить центры кластеров mu;&lt;br /&gt;
    Обновить матрицы ковариации Sigma;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления определителя произвольной матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления матрицы, обратной произвольной матрице ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации - &amp;lt;math&amp;gt;O(K * M^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С учетом заранее вычисленных определителей и обратных матриц сложность вычисления &amp;lt;math&amp;gt;p(x | \mu,\Sigma)&amp;lt;/math&amp;gt; составит: &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага E составит &amp;lt;math&amp;gt;O(N * M^2 * K + K * M^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления весов кластеров &amp;lt;math&amp;gt;O(K * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления центров кластеров &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления одной матрицы ковариации &amp;lt;math&amp;gt;O(N * M)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления всех матриц ковариации &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага M алгоритма - &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит &amp;lt;math&amp;gt;O(K * M^2 * N + K * M^3 + K * M * N)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В предположении, что размерность объектов много меньше их количества &amp;lt;math&amp;gt;M &amp;lt;&amp;lt; N&amp;lt;/math&amp;gt; получим сложность итерации &amp;lt;math&amp;gt;O(K * M^2 * N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большу́ю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее - вынесены за основной цикл шага E&amp;lt;ref name=ParallelEMComparissonGraphLab&amp;gt;Henggang Cui, Jinliang Wei, Wei Dai. Parallel Implementation of Expectation-Maximization for Fast Convergence - School of Computer Science, Carnegie Mellon University. [https://users.ece.cmu.edu/~hengganc/archive/report/final.pdf]&amp;lt;/ref&amp;gt;. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм&amp;lt;ref&amp;gt;Вячеслав Орешков. EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а суммарная сложность шага E и сложность всей итерации составит &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Макроструктура алгоритма представлена на рисунке 1 (см. [[#Макроструктура алгоритма|раздел 1.4]] статьи).&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 представлена схема вычислений E-шага алгоритма для одного объекта: для объекта &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и параметров &amp;lt;math&amp;gt;w_{j}, \mu_{j}, \Sigma_{j}, j=1..K&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются ненормированные значения скрытых переменных &amp;lt;math&amp;gt;g_{j}&amp;lt;/math&amp;gt;, нормировочный коэффициент &#039;&#039;normСoeff&#039;&#039;, и получаются итоговые значения &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step.png|thumb|center|400px|Рисунок 2: E-шаг EM алгоритма для одного объекта]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 представлена схема вычислений E-шага алгоритма для всех объектов: для объекта &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt; и параметров-векторов &amp;lt;math&amp;gt;w, \mu, \Sigma&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются значения скрытых переменных. &amp;lt;math&amp;gt;E_{i}, i=1..N&amp;lt;/math&amp;gt; - маркооперации, E-шаги для соответствующих объектов.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step_all.png|thumb|center|400px|Рисунок 3: E-шаг EM алгоритма для всех объектов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена схема вычислений M-шага алгоритма для одного кластера: для объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и скрытых переменных &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;, соответствующих степени принадлежности этих объектов кластеру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, согласно формулам шага M [[#Математическое описание алгоритма|раздела 1.2]] вычисляется нормировочный коэффициент &amp;lt;math&amp;gt;N_{j}&amp;lt;/math&amp;gt; и параметры этого кластера: вес &amp;lt;math&amp;gt;w_{j}^{new}&amp;lt;/math&amp;gt;, матрица ковариации &amp;lt;math&amp;gt;\Sigma_{j}^{new}&amp;lt;/math&amp;gt; и центр кластера &amp;lt;math&amp;gt;\mu_{j}^{new}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step.png|thumb|center|400px|Рисунок 4: M-шаг EM алгоритма для одного кластера]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена схема вычислений M-шага алгоритма для всех кластеров. &amp;lt;math&amp;gt;M_{j}, j=1..K&amp;lt;/math&amp;gt; соответствует макрооперации - M-шагу для соответствующего кластера и скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step_all.png|thumb|center|400px|Рисунок 5: M-шаг EM алгоритма для всех кластеров]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Из схем вычислений шагов E и M шагов алгоритма, приведенным в [[#Информационный граф|предыдущем разделе]], видно, что если размерность матрицы ковариации небольшая (тогда вычисление определителя и обратной матрицы матрице ковариации не является трудоемкой операцией), обе макрооперации EM алгоритма можно распараллеливать как по кластерам, так и по объектам.&lt;br /&gt;
&lt;br /&gt;
Как правило количество кластеров, на которые нужно разбить объекты, несравнимо меньше количества объектов, поэтому распараллеливание в большинстве существующих реализаций происходит по объектам: обработка объектов по возможности равномерно распределяются по кластерам. Теоретически (если считать передачу данных между процессорами мгновенной) при наличии неограниченного числа процессоров сложность алгоритма составит &amp;lt;math&amp;gt;O(M^2 * K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* Целое неотрицательное число &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
* Значения координат объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов с &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; координатами каждый.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;N * M&amp;lt;/math&amp;gt; вещественных чисел (если координаты объектов - вещественные числа), &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целое неотрицательное число.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор длины &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - для каждого объекта указан номер кластера, к которому он отнесен. Объект относится по результатам работы алгоритма тому кластеру, вероятность принадлежности которому (значение соответствующей скрытой переменной) максимальна.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; целых неотрицательных чисел.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
=== Преимущества и недостатки ===&lt;br /&gt;
EM-алгоритм обладает следующими преимуществами и недостатками&amp;lt;ref&amp;gt;EM алгоритм, его модификации и обобщения. machinelearning.ru [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]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Преимущества:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Слабо чувствителен к выбросам&lt;br /&gt;
# Прост в реализации&lt;br /&gt;
# Быстро сходится при удачном выборе начальных значений параметров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Неустойчив к выбору начальных значений параметров - от них зависит как скорость сходимости, так и результат работы: алгоритм может сойтись к локальному экстремуму функции правдоподобия, который может быть существенно ниже глобального.&lt;br /&gt;
# Алгоритм не находит оптимальное количество кластеров. Количество кластеров, на которые нужно разбить множество объектов, является параметром алгоритма.&lt;br /&gt;
# При большой размерности пространства объектов выдвинутое предположение о модели их распределения может быть некорректным.&lt;br /&gt;
&lt;br /&gt;
=== Влияние структуры матрицы ковариации на форму кластера ===&lt;br /&gt;
&lt;br /&gt;
[[file:DifferentCovariance.png|thumb|center|800px|Рисунок 6: Влияние структуры матрицы ковариации на форму кластеров для двумерного случая. a) - матрицы ковариации являются диагональными, b) - матрицы ковариации произвольны. &amp;lt;ref&amp;gt;Mathworks: Clustering Using Gaussian Mixture Models [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 6 наглядно показывает, что при диагональной форме матриц ковариации полуоси эллипса (в общем случае - эллипсоида), соответствующего распределению объектов, отнесенных кластеру, параллельны осям координат объектов. В противном случае полуоси могут располагаться произвольным образом.&lt;br /&gt;
&lt;br /&gt;
=== Общие свойства ===&lt;br /&gt;
[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] EM алгоритма равна &amp;lt;math&amp;gt;M * K * it&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - размерность объекта, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, а &amp;lt;math&amp;gt;it&amp;lt;/math&amp;gt; - количество итераций. &lt;br /&gt;
&lt;br /&gt;
EM-алгоритм является итерационным, и число итераций в общем случае не фиксировано: оно зависит от условий остановки, начальных приближений и расположения объектов. Поэтому этот алгоритм &#039;&#039;недетерминированный&#039;&#039;. По тем же причинам EM-алгоритм является &#039;&#039;неустойчивым&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
=== Инициализация параметров распределений ===&lt;br /&gt;
Наиболее распространены 3 способа инициализации центров распределений для EM алгоритма:&lt;br /&gt;
# центр распределения совпадает со случайно выбранным объектом &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
# все наблюдения распределяются по кластерам случайным образом, а затем для каждого кластера пересчитывается цент соответствующего распределения&lt;br /&gt;
# центры кластеров получаются в результате работы алгоритма k-means. Использование такой инициализации оправдано тем, что k-means требует меньших вычислительных затрат и быстрее сходится&amp;lt;ref&amp;gt;EM алгоритм (пример) machinelearning.ru [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])&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Многие статьи&amp;lt;ref name=FREERIDE&amp;gt;Leonid Glimcher, Gagan Agrawal. Parallelising EM Algorithm on a Cluster of SMPs [http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CV&amp;gt;López-de-Teruel P. E., García J. M., Acacio; The Parallel EM Algorithm and its Applications in Computer Vision [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=MULTITHREAD&amp;gt;Sharon X. Lee, Kaleb L. Leemaqz, Geoffrey J. McLachlan. A simple multithreaded implementation of the EM algorithm for mixture models [https://arxiv.org/pdf/1606.02054.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CUDA&amp;gt;Araújo, G.F., H.T. Macedo, M.T. Chella, C.A.E. Montesco and M.V.O. Medeiros. PARALLEL IMPLEMENTATION OF EXPECTATION-MAXIMISATION ALGORITHM FOR THE TRAINING OF GAUSSIAN MIXTURE MODELS [https://ri.ufs.br/bitstream/123456789/1764/1/ExpectationMaximisationAlgorithm.pdf]&amp;lt;/ref&amp;gt;, в которых представлены параллельные реализации EM алгоритма, описывают помимо использующихся программных и аппаратных решений результаты проведенных экспериментов с данными. В качестве примера в этом разделе будут рассмотрены результаты эксперементов, проведенных со связующим программным обеспечением (&#039;&#039;middleware&#039;&#039;) FREERIDE&amp;lt;ref&amp;gt;Leonid Glimchera, Ruoming Jinb, Gagan Agrawala. Middleware for data mining applications on clusters and grids [http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf]&amp;lt;/ref&amp;gt; (FRamework for Rapid Implementation of Datamining Engines), обеспечивающим возможность распараллеливания как для систем с общей памятью (в частности, симметричных мультипроцессорных систем), так и для систем с распределенной памятью.&lt;br /&gt;
&lt;br /&gt;
Эксперименты проводились на кластере машин Pentium 700MHz связанных при помощи Myrinet&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Myrinet&amp;lt;/ref&amp;gt; LANai 7.0 на трех наборах данных: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;а)&#039;&#039;&#039; 3.3 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; 6.2 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; 12.5 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
Объекты представляют собой координаты точек 10-мерного пространства.&lt;br /&gt;
 &lt;br /&gt;
Количество машин в кластере варьировалось от 1 до 8, при этом на каждой машине запускалось до четырех параллельных потоков.&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов представлены на рисунках 7-9&amp;lt;ref name=FREERIDE/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_a.png|thumb|center|350px|Рисунок 7: набор данных a)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_b.png|thumb|center|357px|Рисунок 8: набор данных b)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_c.png|thumb|center|351px|Рисунок 9: набор данных c)]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что используемые в данном исследовании машины, как и коммуникационная среда, сейчас не используются и считаются устаревшими, результат приведенных экспериментов наглядно показывает, что EM алгоритм хорошо параллелится, зависимость ускорения от числа узлов в кластере с небольшим количеством узлов близка к линейной, а также, что скорость работы алгоритма линейно зависит от числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Данный раздел может быть дополнен&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Примеры библиотек, содержащих последовательную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV(C++)] ([https://github.com/opencv/opencv/blob/master/modules/ml/src/em.cpp github])&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab]&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html Scikit learn (Python)]&lt;br /&gt;
# [http://mlpack.org/index.html MLPack(C++)]&lt;br /&gt;
&lt;br /&gt;
Примеры библиотек, содержащих параллельную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Здесь приводятся как конкретные реализации, так и статьи, описывающие подходы к реализациям распараллеливания EM-алгоритма&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# [https://spark.apache.org/ Apache Spark]&lt;br /&gt;
# [http://accord-framework.net/ Accord.NET Framework (C#)]&lt;br /&gt;
# Статья об использовании FREERIDE middleware для распараллеливания EM алгоритма &amp;lt;ref name=FREERIDE/&amp;gt; &lt;br /&gt;
# [http://andrewharp.com/gmmcuda реализация с использованием CUDA]&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MPI еще одна реализация с использованием CUDA]&lt;br /&gt;
# статья об использовании параллельного EM алгоритма в задачах компьютерного зрения &amp;lt;ref name=CV/&amp;gt;&lt;br /&gt;
# статья о распараллеливании EM алгоритма с использованием CUDA &amp;lt;ref name=CUDA/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Noite</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Noite&amp;diff=16929</id>
		<title>Обсуждение участника:Noite</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Noite&amp;diff=16929"/>
		<updated>2016-11-14T10:51:59Z</updated>

		<summary type="html">&lt;p&gt;Noite: /* Замечания к Участник:Noite/EM-алгоритм_кластеризации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Замечания к [[Участник:Noite/EM-алгоритм_кластеризации]] ==&lt;br /&gt;
&lt;br /&gt;
1) лишняя строка &amp;quot;Алгоритм кластеризации, основанный на максимизации ожидания (EM-алгоритм)&amp;quot; перед содержанием --- убрано&lt;br /&gt;
&lt;br /&gt;
2) отсутствует оценка высоты и ширины ЯПФ параллельного алгоритма во врезке в начале статьи --- врезка исправлена&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ниже - замечания второго рецензента&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
3) Во врезке так и не появилась информация по поводу параллельного алгоритма&lt;br /&gt;
&lt;br /&gt;
4) Из содержания нужно убрать ссылку [5] --- имеется ввиду из заголовка раздела? или подобную ссылку вообще нельзя использовать? пока ссылка перенесена из заголовка внутрь раздела&lt;br /&gt;
&lt;br /&gt;
5) В формулировке задачи в п1.1 нет разъяснения параметра m --- формулировка задачи кластеризации изменена&lt;br /&gt;
&lt;br /&gt;
6) В п1.2 парметры m, n, k почему-то превратились в M, N, K --- параметры m,n,k изменены в п1.1 и во врезке на M,N,K соответственно (пока исправлено не полностью, нужно поправить в диаграммах)&lt;br /&gt;
&lt;br /&gt;
7) П 1.5. Как инициализируются скрытые переменные gamma? Выравнивание псевдокода местами нарушено. Слово &amp;quot;большУю&amp;quot; - здесь лучше использовать значок ударения --- слово большУю исправлено. Скрытые переменные могут быть инициализированы любым образом, поскольку первый E-шаг алгоритма их в любом случае перезапишет. Выравнивание псевдокода изменено.&lt;br /&gt;
&lt;br /&gt;
8) П 1.7 Информационный граф: на рисунке омега превратилась в w, гамма - в Y. --- в используемом редакторе изображений для гаммы использовался следующий символ: γ. То, что он похож на Y - визуальное совпадение. (w пока не исправлено) &lt;br /&gt;
&lt;br /&gt;
9)П 1.9 Выходные данные - сказано о векторе n. Поясните, какое значение он имеет в терминах алгоритма кластеризации. --- пояснение добавлено&lt;/div&gt;</summary>
		<author><name>Noite</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:Noite/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=16927</id>
		<title>Участник:Noite/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:Noite/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=16927"/>
		<updated>2016-11-14T10:51:39Z</updated>

		<summary type="html">&lt;p&gt;Noite: /* Общие свойства */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(N * M^2 * K)&amp;lt;/math&amp;gt; - одна итерация&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;N * M + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Noite|Зинченко Д.А.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
В задачах оптимизации EM-алгоритмом называют итеративную процедуру поиска численного значения экстремума какой-либо функции. В частности, в статистике этот алгоритм используется для оценки максимального правдоподобия. Впервые название EM-алгоритм было предложено в 1977 году&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;, однако его идеи были описаны и раньше&amp;lt;ref name=korolev&amp;gt;В.Ю.Королёв. ЕМ-алгоритм, его модификации и их применение к задаче разделения смесей вероятностных распределений.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм применяется для решения задач двух типов &amp;lt;ref name=korolev/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Анализ неполных данных (данных с пропусками). &lt;br /&gt;
# Оценка максимального правдоподобия в случае, если функцию правдоподобия трудно исследовать аналитически. В этом случае введение набора скрытых переменных может существенно упростить задачу.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к задачам второго типа. В данной статье рассматривается следующая постановка задачи кластеризации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;Дано множество из N объектов, каждый из которых представляет собой точку в M-мерном метрическом пространстве. Каждому измерению пространства соответствует некоторое свойство объекта. Необходимо разбить это множество на K подмножеств (кластеров) так, чтобы, чтобы элементы каждого подмножества существенно отличались по свойствам от элементов других подмножеств.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование алгоритма EM подразумевает следующее &#039;&#039;предположение об объектах&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Пусть объекты, которые необходимо разбить на кластеры, появляются случайным образом и независимо друг от друга согласно вероятностному распределению, равному смеси (линейной комбинации) распределений кластеров. В данной статье в дальнейшем будет считаться, что распределение каждого кластера является многомерным нормальным распределением с произвольной матрицей ковариации - наиболее часто используемое предположение.&lt;br /&gt;
&lt;br /&gt;
Тогда каждый объект принадлежит каждому кластеру, но с разной вероятностью. EM-алгоритм итеративно оценивает параметры распределений кластеров, максимизируя логарифмическую функцию максимального правдоподобия. После окончания работы алгоритма объект будет отнесен к кластеру, вероятность принадлежности которому максимальна. Вводимый набор скрытых переменных для каждого объекта - вероятности того, что объект принадлежит каждому из кластеров.&lt;br /&gt;
&lt;br /&gt;
Итерация алгоритма состоит из двух последовательных шагов.&lt;br /&gt;
&lt;br /&gt;
# (Expectation) Вычисляются новые ожидаемые значения скрытых переменных.&lt;br /&gt;
# (Maximization) Решается задача максимизации правдоподобия: По текущим значениям скрытых переменных обновляются параметры распределений для кластеров: математическое ожидание, дисперсия и вероятность появления объектов из кластера.&lt;br /&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;N&amp;lt;/math&amp;gt; - количество объектов, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - количество параметров объекта&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\gamma_{n,k}&amp;lt;/math&amp;gt; - значения скрытых переменных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N_{k}&amp;lt;/math&amp;gt; - количество элементов отнесенных к кластеру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{1},...,x_N&amp;lt;/math&amp;gt; - объекты&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Параметры распределений:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{1},...,w_{K}&amp;lt;/math&amp;gt; - вероятности появления объектов из кластеров (веса кластеров), &amp;lt;math&amp;gt;\sum_{k=1}^Kw_{k}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{1},...,\mu_{K}&amp;lt;/math&amp;gt; - центры гауссиан кластеров&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma_{1},...,\Sigma_{K}&amp;lt;/math&amp;gt; - матрицы ковариации гауссиан кластеров, каждая матрица имеет размерность &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Смесь распределений:&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; P(x) = \sum_{j=1}^Kw_jp(x|\mu_{j}, \Sigma_{j})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Цель алгоритма - вычислить параметры распределений, максимизирующих логарифм функции правдоподобия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\ln P(x|w,\mu,\Sigma)= \sum_{n=1}^N \ln \{ \sum_{k=1}^K w_{k}p(x_{n}|\mu_{k},\Sigma_{k})\}&amp;lt;/math&amp;gt;.&amp;lt;/center&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
* В начале работы алгоритма задаются параметры начального приближения:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{i} = 1/K, \mu_{i} = random(x_{j}), i=1..K, j=1..N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{j,j}^{k}=\frac{1}{NK}\sum_{i=1}^N(x_{i,j} - \mu_{k,j})^2, k=1..K, j=1..M&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Поскольку от начального приближения может сильно зависеть результат работы алгоритма, вместо инициализации кластеров случайными центрами, равными весами и диагональными матрицами ковариации, как в приведенных формулах, часто применяют другие способы (подробнее - в [[#Особенности реализации последовательного алгоритма | особенностях реализации]])&#039;&#039;&lt;br /&gt;
* Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
** E-шаг: используя текущее значение параметров &amp;lt;math&amp;gt;w_{1},...,w_{k};\mu_{1},...,\mu_{k};\Sigma^{1},...,\Sigma^{k}&amp;lt;/math&amp;gt;, вычисляем значение вектора скрытых переменных &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\gamma_{n,k}=\frac{w_{k}p(x_{n}|\mu_{k},\Sigma^{k})}{\sum_{j=1}^K w_{j}p(x_{n}|\mu_{j},\Sigma^{j})}, &amp;lt;/math&amp;gt; знаменатель дроби - нормировочный коэффициент&amp;lt;/center&amp;gt;&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p(x|\mu,\Sigma)=\frac{1}{{(2\pi)}^{\frac{N}{2}}\sqrt{|\Sigma|}}exp\biggl\{-\frac{1}{2}{(x-\mu)}^T{\Sigma}^{-1}(x-\mu)\biggr\}&amp;lt;/math&amp;gt; - плотность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерного нормального распределения&amp;lt;/center&amp;gt;&lt;br /&gt;
** М-шаг: переоценка параметров по текущим значениям скрытых переменных для &amp;lt;math&amp;gt;k = 1..K&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\mu^{new}_{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k}x_{n}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{new}^{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k} (x_{n}-\mu_{k}^{new})(x_{n}-\mu_{k}^{new})^{T}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{k}^{new}=\frac{N_{k}}{N}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;N_{k}=\sum_{n=1}^N \gamma_{n,k}&amp;lt;/math&amp;gt;.&amp;lt;/center&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;
Вычислительное ядро алгоритма состоит из двух шагов, повторяющихся каждую итерацию:&lt;br /&gt;
*Обновление скрытых переменных на основе текущих параметров распределений&lt;br /&gt;
*Обновление параметров кластеров: весов, центров и матриц ковариации&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании вычислительного ядра алгоритма]], основную часть алгоритма составляют итеративно проводимые макрооперации: Expectation шаг - вычисление новых значений скрытых переменных, Maximization шаг - обновление параметров кластеров. Макроструктура алгоритма представлена на рисунке 1:&lt;br /&gt;
[[file:EM_macro.png|thumb|center|600px|Рисунок 1: Макроструктура EM-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Примерная схема реализации EM алгоритма с предварительной обработкой матриц ковариации:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Инициализировать веса и центры кластеров;&lt;br /&gt;
Инициализировать матрицы ковариации;&lt;br /&gt;
&lt;br /&gt;
// Основной цикл&lt;br /&gt;
Пока условие остановки не выполнено&lt;br /&gt;
    // E-шаг&lt;br /&gt;
    В цикле для каждого кластера&lt;br /&gt;
        Вычислить определитель матрицы ковариации Sigma;&lt;br /&gt;
        Вычислить обратную матрицу матрице Sigma;&lt;br /&gt;
    В цикле для каждого объекта&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Вычислить и запомнить p(x | mu, Sigma) для текущего объекта и кластера;&lt;br /&gt;
        Просуммировать вычисленные p(x | mu, Sigma);&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Обновить скрытые переменные gamma;&lt;br /&gt;
    // M-шаг&lt;br /&gt;
    Обновить веса w;&lt;br /&gt;
    Обновить центры кластеров mu;&lt;br /&gt;
    Обновить матрицы ковариации Sigma;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления определителя произвольной матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления матрицы, обратной произвольной матрице ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации - &amp;lt;math&amp;gt;O(K * M^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С учетом заранее вычисленных определителей и обратных матриц сложность вычисления &amp;lt;math&amp;gt;p(x | \mu,\Sigma)&amp;lt;/math&amp;gt; составит: &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага E составит &amp;lt;math&amp;gt;O(N * M^2 * K + K * M^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления весов кластеров &amp;lt;math&amp;gt;O(K * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления центров кластеров &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления одной матрицы ковариации &amp;lt;math&amp;gt;O(N * M)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления всех матриц ковариации &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага M алгоритма - &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит &amp;lt;math&amp;gt;O(K * M^2 * N + K * M^3 + K * M * N)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В предположении, что размерность объектов много меньше их количества &amp;lt;math&amp;gt;M &amp;lt;&amp;lt; N&amp;lt;/math&amp;gt; получим сложность итерации &amp;lt;math&amp;gt;O(K * M^2 * N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большу́ю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее - вынесены за основной цикл шага E&amp;lt;ref name=ParallelEMComparissonGraphLab&amp;gt;Henggang Cui, Jinliang Wei, Wei Dai. Parallel Implementation of Expectation-Maximization for Fast Convergence - School of Computer Science, Carnegie Mellon University. [https://users.ece.cmu.edu/~hengganc/archive/report/final.pdf]&amp;lt;/ref&amp;gt;. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм&amp;lt;ref&amp;gt;Вячеслав Орешков. EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а суммарная сложность шага E и сложность всей итерации составит &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Макроструктура алгоритма представлена на рисунке 1 (см. [[#Макроструктура алгоритма|раздел 1.4]] статьи).&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 представлена схема вычислений E-шага алгоритма для одного объекта: для объекта &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и параметров &amp;lt;math&amp;gt;w_{j}, \mu_{j}, \Sigma_{j}, j=1..K&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются ненормированные значения скрытых переменных &amp;lt;math&amp;gt;g_{j}&amp;lt;/math&amp;gt;, нормировочный коэффициент &#039;&#039;normСoeff&#039;&#039;, и получаются итоговые значения &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step.png|thumb|center|400px|Рисунок 2: E-шаг EM алгоритма для одного объекта]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 представлена схема вычислений E-шага алгоритма для всех объектов: для объекта &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt; и параметров-векторов &amp;lt;math&amp;gt;w, \mu, \Sigma&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются значения скрытых переменных. &amp;lt;math&amp;gt;E_{i}, i=1..N&amp;lt;/math&amp;gt; - маркооперации, E-шаги для соответствующих объектов.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step_all.png|thumb|center|400px|Рисунок 3: E-шаг EM алгоритма для всех объектов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена схема вычислений M-шага алгоритма для одного кластера: для объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и скрытых переменных &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;, соответствующих степени принадлежности этих объектов кластеру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, согласно формулам шага M [[#Математическое описание алгоритма|раздела 1.2]] вычисляется нормировочный коэффициент &amp;lt;math&amp;gt;N_{j}&amp;lt;/math&amp;gt; и параметры этого кластера: вес &amp;lt;math&amp;gt;w_{j}^{new}&amp;lt;/math&amp;gt;, матрица ковариации &amp;lt;math&amp;gt;\Sigma_{j}^{new}&amp;lt;/math&amp;gt; и центр кластера &amp;lt;math&amp;gt;\mu_{j}^{new}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step.png|thumb|center|400px|Рисунок 4: M-шаг EM алгоритма для одного кластера]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена схема вычислений M-шага алгоритма для всех кластеров. &amp;lt;math&amp;gt;M_{j}, j=1..K&amp;lt;/math&amp;gt; соответствует макрооперации - M-шагу для соответствующего кластера и скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step_all.png|thumb|center|400px|Рисунок 5: M-шаг EM алгоритма для всех кластеров]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Из схем вычислений шагов E и M шагов алгоритма, приведенным в [[#Информационный граф|предыдущем разделе]], видно, что если размерность матрицы ковариации небольшая (тогда вычисление определителя и обратной матрицы матрице ковариации не является трудоемкой операцией), обе макрооперации EM алгоритма можно распараллеливать как по кластерам, так и по объектам.&lt;br /&gt;
&lt;br /&gt;
Как правило количество кластеров, на которые нужно разбить объекты, несравнимо меньше количества объектов, поэтому распараллеливание в большинстве существующих реализаций происходит по объектам: обработка объектов по возможности равномерно распределяются по кластерам. Теоретически (если считать передачу данных между процессорами мгновенной) при наличии неограниченного числа процессоров сложность алгоритма составит &amp;lt;math&amp;gt;O(M^2 * K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* Целое неотрицательное число &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
* Значения координат объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов с &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; координатами каждый.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;N * M&amp;lt;/math&amp;gt; вещественных чисел (если координаты объектов - вещественные числа), &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целое неотрицательное число.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор длины &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - для каждого объекта указан номер кластера, к которому он отнесен. Объект относится по результатам работы алгоритма тому кластеру, вероятность принадлежности которому (значение соответствующей скрытой переменной) максимальна.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; целых неотрицательных чисел.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
=== Преимущества и недостатки ===&lt;br /&gt;
EM-алгоритм обладает следующими преимуществами и недостатками&amp;lt;ref&amp;gt;EM алгоритм, его модификации и обобщения. machinelearning.ru [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]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Преимущества:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Слабо чувствителен к выбросам&lt;br /&gt;
# Прост в реализации&lt;br /&gt;
# Быстро сходится при удачном выборе начальных значений параметров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Неустойчив к выбору начальных значений параметров - от них зависит как скорость сходимости, так и результат работы: алгоритм может сойтись к локальному экстремуму функции правдоподобия, который может быть существенно ниже глобального.&lt;br /&gt;
# Алгоритм не находит оптимальное количество кластеров. Количество кластеров, на которые нужно разбить множество объектов, является параметром алгоритма.&lt;br /&gt;
# При большой размерности пространства объектов выдвинутое предположение о модели их распределения может быть некорректным.&lt;br /&gt;
&lt;br /&gt;
=== Влияние структуры матрицы ковариации на форму кластера ===&lt;br /&gt;
&lt;br /&gt;
[[file:DifferentCovariance.png|thumb|center|800px|Рисунок 6: Влияние структуры матрицы ковариации на форму кластеров для двумерного случая. a) - матрицы ковариации являются диагональными, b) - матрицы ковариации произвольны. &amp;lt;ref&amp;gt;Mathworks: Clustering Using Gaussian Mixture Models [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 6 наглядно показывает, что при диагональной форме матриц ковариации полуоси эллипса (в общем случае - эллипсоида), соответствующего распределению объектов, отнесенных кластеру, параллельны осям координат объектов. В противном случае полуоси могут располагаться произвольным образом.&lt;br /&gt;
&lt;br /&gt;
=== Общие свойства ===&lt;br /&gt;
[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] EM алгоритма равна &amp;lt;math&amp;gt;M * K * it&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - размерность объекта, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, а &amp;lt;math&amp;gt;it&amp;lt;/math&amp;gt; - количество итераций. &lt;br /&gt;
&lt;br /&gt;
EM-алгоритм является итерационным, и число итераций в общем случае не фиксировано: оно зависит от условий остановки, начальных приближений и расположения объектов. Поэтому этот алгоритм &#039;&#039;недетерминированный&#039;&#039;. По тем же причинам EM-алгоритм является &#039;&#039;неустойчивым&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
=== Инициализация параметров распределений ===&lt;br /&gt;
Наиболее распространены 3 способа инициализации центров распределений для EM алгоритма:&lt;br /&gt;
# центр распределения совпадает со случайно выбранным объектом &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
# все наблюдения распределяются по кластерам случайным образом, а затем для каждого кластера пересчитывается цент соответствующего распределения&lt;br /&gt;
# центры кластеров получаются в результате работы алгоритма k-means. Использование такой инициализации оправдано тем, что k-means требует меньших вычислительных затрат и быстрее сходится&amp;lt;ref&amp;gt;EM алгоритм (пример) machinelearning.ru [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])&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Многие статьи&amp;lt;ref name=FREERIDE&amp;gt;Leonid Glimcher, Gagan Agrawal. Parallelising EM Algorithm on a Cluster of SMPs [http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CV&amp;gt;López-de-Teruel P. E., García J. M., Acacio; The Parallel EM Algorithm and its Applications in Computer Vision [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=MULTITHREAD&amp;gt;Sharon X. Lee, Kaleb L. Leemaqz, Geoffrey J. McLachlan. A simple multithreaded implementation of the EM algorithm for mixture models [https://arxiv.org/pdf/1606.02054.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CUDA&amp;gt;Araújo, G.F., H.T. Macedo, M.T. Chella, C.A.E. Montesco and M.V.O. Medeiros. PARALLEL IMPLEMENTATION OF EXPECTATION-MAXIMISATION ALGORITHM FOR THE TRAINING OF GAUSSIAN MIXTURE MODELS [https://ri.ufs.br/bitstream/123456789/1764/1/ExpectationMaximisationAlgorithm.pdf]&amp;lt;/ref&amp;gt;, в которых представлены параллельные реализации EM алгоритма, описывают помимо использующихся программных и аппаратных решений результаты проведенных экспериментов с данными. В качестве примера в этом разделе будут рассмотрены результаты эксперементов, проведенных со связующим программным обеспечением (&#039;&#039;middleware&#039;&#039;) FREERIDE&amp;lt;ref&amp;gt;Leonid Glimchera, Ruoming Jinb, Gagan Agrawala. Middleware for data mining applications on clusters and grids [http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf]&amp;lt;/ref&amp;gt; (FRamework for Rapid Implementation of Datamining Engines), обеспечивающим возможность распараллеливания как для систем с общей памятью (в частности, симметричных мультипроцессорных систем), так и для систем с распределенной памятью.&lt;br /&gt;
&lt;br /&gt;
Эксперименты проводились на кластере машин Pentium 700MHz связанных при помощи Myrinet&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Myrinet&amp;lt;/ref&amp;gt; LANai 7.0 на трех наборах данных: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;а)&#039;&#039;&#039; 3.3 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; 6.2 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; 12.5 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
Объекты представляют собой координаты точек 10-мерного пространства.&lt;br /&gt;
 &lt;br /&gt;
Количество машин в кластере варьировалось от 1 до 8, при этом на каждой машине запускалось до четырех параллельных потоков.&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов представлены на рисунках 7-9&amp;lt;ref name=FREERIDE/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_a.png|thumb|center|350px|Рисунок 7: набор данных a)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_b.png|thumb|center|357px|Рисунок 8: набор данных b)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_c.png|thumb|center|351px|Рисунок 9: набор данных c)]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что используемые в данном исследовании машины, как и коммуникационная среда, сейчас не используются и считаются устаревшими, результат приведенных экспериментов наглядно показывает, что EM алгоритм хорошо параллелится, зависимость ускорения от числа узлов в кластере с небольшим количеством узлов близка к линейной, а также, что скорость работы алгоритма линейно зависит от числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Данный раздел может быть дополнен&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Примеры библиотек, содержащих последовательную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV(C++)] ([https://github.com/opencv/opencv/blob/master/modules/ml/src/em.cpp github])&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab]&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html Scikit learn (Python)]&lt;br /&gt;
# [http://mlpack.org/index.html MLPack(C++)]&lt;br /&gt;
&lt;br /&gt;
Примеры библиотек, содержащих параллельную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Здесь приводятся как конкретные реализации, так и статьи, описывающие подходы к реализациям распараллеливания EM-алгоритма&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# [https://spark.apache.org/ Apache Spark]&lt;br /&gt;
# [http://accord-framework.net/ Accord.NET Framework (C#)]&lt;br /&gt;
# Статья об использовании FREERIDE middleware для распараллеливания EM алгоритма &amp;lt;ref name=FREERIDE/&amp;gt; &lt;br /&gt;
# [http://andrewharp.com/gmmcuda реализация с использованием CUDA]&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MPI еще одна реализация с использованием CUDA]&lt;br /&gt;
# статья об использовании параллельного EM алгоритма в задачах компьютерного зрения &amp;lt;ref name=CV/&amp;gt;&lt;br /&gt;
# статья о распараллеливании EM алгоритма с использованием CUDA &amp;lt;ref name=CUDA/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Noite</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:Noite/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=16926</id>
		<title>Участник:Noite/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:Noite/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=16926"/>
		<updated>2016-11-14T10:51:11Z</updated>

		<summary type="html">&lt;p&gt;Noite: /* Общие свойства */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(N * M^2 * K)&amp;lt;/math&amp;gt; - одна итерация&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;N * M + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Noite|Зинченко Д.А.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
В задачах оптимизации EM-алгоритмом называют итеративную процедуру поиска численного значения экстремума какой-либо функции. В частности, в статистике этот алгоритм используется для оценки максимального правдоподобия. Впервые название EM-алгоритм было предложено в 1977 году&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;, однако его идеи были описаны и раньше&amp;lt;ref name=korolev&amp;gt;В.Ю.Королёв. ЕМ-алгоритм, его модификации и их применение к задаче разделения смесей вероятностных распределений.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм применяется для решения задач двух типов &amp;lt;ref name=korolev/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Анализ неполных данных (данных с пропусками). &lt;br /&gt;
# Оценка максимального правдоподобия в случае, если функцию правдоподобия трудно исследовать аналитически. В этом случае введение набора скрытых переменных может существенно упростить задачу.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к задачам второго типа. В данной статье рассматривается следующая постановка задачи кластеризации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;Дано множество из N объектов, каждый из которых представляет собой точку в M-мерном метрическом пространстве. Каждому измерению пространства соответствует некоторое свойство объекта. Необходимо разбить это множество на K подмножеств (кластеров) так, чтобы, чтобы элементы каждого подмножества существенно отличались по свойствам от элементов других подмножеств.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование алгоритма EM подразумевает следующее &#039;&#039;предположение об объектах&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Пусть объекты, которые необходимо разбить на кластеры, появляются случайным образом и независимо друг от друга согласно вероятностному распределению, равному смеси (линейной комбинации) распределений кластеров. В данной статье в дальнейшем будет считаться, что распределение каждого кластера является многомерным нормальным распределением с произвольной матрицей ковариации - наиболее часто используемое предположение.&lt;br /&gt;
&lt;br /&gt;
Тогда каждый объект принадлежит каждому кластеру, но с разной вероятностью. EM-алгоритм итеративно оценивает параметры распределений кластеров, максимизируя логарифмическую функцию максимального правдоподобия. После окончания работы алгоритма объект будет отнесен к кластеру, вероятность принадлежности которому максимальна. Вводимый набор скрытых переменных для каждого объекта - вероятности того, что объект принадлежит каждому из кластеров.&lt;br /&gt;
&lt;br /&gt;
Итерация алгоритма состоит из двух последовательных шагов.&lt;br /&gt;
&lt;br /&gt;
# (Expectation) Вычисляются новые ожидаемые значения скрытых переменных.&lt;br /&gt;
# (Maximization) Решается задача максимизации правдоподобия: По текущим значениям скрытых переменных обновляются параметры распределений для кластеров: математическое ожидание, дисперсия и вероятность появления объектов из кластера.&lt;br /&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;N&amp;lt;/math&amp;gt; - количество объектов, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - количество параметров объекта&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\gamma_{n,k}&amp;lt;/math&amp;gt; - значения скрытых переменных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N_{k}&amp;lt;/math&amp;gt; - количество элементов отнесенных к кластеру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{1},...,x_N&amp;lt;/math&amp;gt; - объекты&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Параметры распределений:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{1},...,w_{K}&amp;lt;/math&amp;gt; - вероятности появления объектов из кластеров (веса кластеров), &amp;lt;math&amp;gt;\sum_{k=1}^Kw_{k}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{1},...,\mu_{K}&amp;lt;/math&amp;gt; - центры гауссиан кластеров&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma_{1},...,\Sigma_{K}&amp;lt;/math&amp;gt; - матрицы ковариации гауссиан кластеров, каждая матрица имеет размерность &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Смесь распределений:&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; P(x) = \sum_{j=1}^Kw_jp(x|\mu_{j}, \Sigma_{j})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Цель алгоритма - вычислить параметры распределений, максимизирующих логарифм функции правдоподобия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\ln P(x|w,\mu,\Sigma)= \sum_{n=1}^N \ln \{ \sum_{k=1}^K w_{k}p(x_{n}|\mu_{k},\Sigma_{k})\}&amp;lt;/math&amp;gt;.&amp;lt;/center&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
* В начале работы алгоритма задаются параметры начального приближения:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{i} = 1/K, \mu_{i} = random(x_{j}), i=1..K, j=1..N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{j,j}^{k}=\frac{1}{NK}\sum_{i=1}^N(x_{i,j} - \mu_{k,j})^2, k=1..K, j=1..M&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Поскольку от начального приближения может сильно зависеть результат работы алгоритма, вместо инициализации кластеров случайными центрами, равными весами и диагональными матрицами ковариации, как в приведенных формулах, часто применяют другие способы (подробнее - в [[#Особенности реализации последовательного алгоритма | особенностях реализации]])&#039;&#039;&lt;br /&gt;
* Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
** E-шаг: используя текущее значение параметров &amp;lt;math&amp;gt;w_{1},...,w_{k};\mu_{1},...,\mu_{k};\Sigma^{1},...,\Sigma^{k}&amp;lt;/math&amp;gt;, вычисляем значение вектора скрытых переменных &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\gamma_{n,k}=\frac{w_{k}p(x_{n}|\mu_{k},\Sigma^{k})}{\sum_{j=1}^K w_{j}p(x_{n}|\mu_{j},\Sigma^{j})}, &amp;lt;/math&amp;gt; знаменатель дроби - нормировочный коэффициент&amp;lt;/center&amp;gt;&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p(x|\mu,\Sigma)=\frac{1}{{(2\pi)}^{\frac{N}{2}}\sqrt{|\Sigma|}}exp\biggl\{-\frac{1}{2}{(x-\mu)}^T{\Sigma}^{-1}(x-\mu)\biggr\}&amp;lt;/math&amp;gt; - плотность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерного нормального распределения&amp;lt;/center&amp;gt;&lt;br /&gt;
** М-шаг: переоценка параметров по текущим значениям скрытых переменных для &amp;lt;math&amp;gt;k = 1..K&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\mu^{new}_{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k}x_{n}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{new}^{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k} (x_{n}-\mu_{k}^{new})(x_{n}-\mu_{k}^{new})^{T}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{k}^{new}=\frac{N_{k}}{N}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;N_{k}=\sum_{n=1}^N \gamma_{n,k}&amp;lt;/math&amp;gt;.&amp;lt;/center&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;
Вычислительное ядро алгоритма состоит из двух шагов, повторяющихся каждую итерацию:&lt;br /&gt;
*Обновление скрытых переменных на основе текущих параметров распределений&lt;br /&gt;
*Обновление параметров кластеров: весов, центров и матриц ковариации&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании вычислительного ядра алгоритма]], основную часть алгоритма составляют итеративно проводимые макрооперации: Expectation шаг - вычисление новых значений скрытых переменных, Maximization шаг - обновление параметров кластеров. Макроструктура алгоритма представлена на рисунке 1:&lt;br /&gt;
[[file:EM_macro.png|thumb|center|600px|Рисунок 1: Макроструктура EM-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Примерная схема реализации EM алгоритма с предварительной обработкой матриц ковариации:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Инициализировать веса и центры кластеров;&lt;br /&gt;
Инициализировать матрицы ковариации;&lt;br /&gt;
&lt;br /&gt;
// Основной цикл&lt;br /&gt;
Пока условие остановки не выполнено&lt;br /&gt;
    // E-шаг&lt;br /&gt;
    В цикле для каждого кластера&lt;br /&gt;
        Вычислить определитель матрицы ковариации Sigma;&lt;br /&gt;
        Вычислить обратную матрицу матрице Sigma;&lt;br /&gt;
    В цикле для каждого объекта&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Вычислить и запомнить p(x | mu, Sigma) для текущего объекта и кластера;&lt;br /&gt;
        Просуммировать вычисленные p(x | mu, Sigma);&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Обновить скрытые переменные gamma;&lt;br /&gt;
    // M-шаг&lt;br /&gt;
    Обновить веса w;&lt;br /&gt;
    Обновить центры кластеров mu;&lt;br /&gt;
    Обновить матрицы ковариации Sigma;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления определителя произвольной матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления матрицы, обратной произвольной матрице ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации - &amp;lt;math&amp;gt;O(K * M^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С учетом заранее вычисленных определителей и обратных матриц сложность вычисления &amp;lt;math&amp;gt;p(x | \mu,\Sigma)&amp;lt;/math&amp;gt; составит: &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага E составит &amp;lt;math&amp;gt;O(N * M^2 * K + K * M^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления весов кластеров &amp;lt;math&amp;gt;O(K * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления центров кластеров &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления одной матрицы ковариации &amp;lt;math&amp;gt;O(N * M)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления всех матриц ковариации &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага M алгоритма - &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит &amp;lt;math&amp;gt;O(K * M^2 * N + K * M^3 + K * M * N)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В предположении, что размерность объектов много меньше их количества &amp;lt;math&amp;gt;M &amp;lt;&amp;lt; N&amp;lt;/math&amp;gt; получим сложность итерации &amp;lt;math&amp;gt;O(K * M^2 * N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большу́ю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее - вынесены за основной цикл шага E&amp;lt;ref name=ParallelEMComparissonGraphLab&amp;gt;Henggang Cui, Jinliang Wei, Wei Dai. Parallel Implementation of Expectation-Maximization for Fast Convergence - School of Computer Science, Carnegie Mellon University. [https://users.ece.cmu.edu/~hengganc/archive/report/final.pdf]&amp;lt;/ref&amp;gt;. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм&amp;lt;ref&amp;gt;Вячеслав Орешков. EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а суммарная сложность шага E и сложность всей итерации составит &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Макроструктура алгоритма представлена на рисунке 1 (см. [[#Макроструктура алгоритма|раздел 1.4]] статьи).&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 представлена схема вычислений E-шага алгоритма для одного объекта: для объекта &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и параметров &amp;lt;math&amp;gt;w_{j}, \mu_{j}, \Sigma_{j}, j=1..K&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются ненормированные значения скрытых переменных &amp;lt;math&amp;gt;g_{j}&amp;lt;/math&amp;gt;, нормировочный коэффициент &#039;&#039;normСoeff&#039;&#039;, и получаются итоговые значения &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step.png|thumb|center|400px|Рисунок 2: E-шаг EM алгоритма для одного объекта]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 представлена схема вычислений E-шага алгоритма для всех объектов: для объекта &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt; и параметров-векторов &amp;lt;math&amp;gt;w, \mu, \Sigma&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются значения скрытых переменных. &amp;lt;math&amp;gt;E_{i}, i=1..N&amp;lt;/math&amp;gt; - маркооперации, E-шаги для соответствующих объектов.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step_all.png|thumb|center|400px|Рисунок 3: E-шаг EM алгоритма для всех объектов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена схема вычислений M-шага алгоритма для одного кластера: для объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и скрытых переменных &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;, соответствующих степени принадлежности этих объектов кластеру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, согласно формулам шага M [[#Математическое описание алгоритма|раздела 1.2]] вычисляется нормировочный коэффициент &amp;lt;math&amp;gt;N_{j}&amp;lt;/math&amp;gt; и параметры этого кластера: вес &amp;lt;math&amp;gt;w_{j}^{new}&amp;lt;/math&amp;gt;, матрица ковариации &amp;lt;math&amp;gt;\Sigma_{j}^{new}&amp;lt;/math&amp;gt; и центр кластера &amp;lt;math&amp;gt;\mu_{j}^{new}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step.png|thumb|center|400px|Рисунок 4: M-шаг EM алгоритма для одного кластера]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена схема вычислений M-шага алгоритма для всех кластеров. &amp;lt;math&amp;gt;M_{j}, j=1..K&amp;lt;/math&amp;gt; соответствует макрооперации - M-шагу для соответствующего кластера и скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step_all.png|thumb|center|400px|Рисунок 5: M-шаг EM алгоритма для всех кластеров]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Из схем вычислений шагов E и M шагов алгоритма, приведенным в [[#Информационный граф|предыдущем разделе]], видно, что если размерность матрицы ковариации небольшая (тогда вычисление определителя и обратной матрицы матрице ковариации не является трудоемкой операцией), обе макрооперации EM алгоритма можно распараллеливать как по кластерам, так и по объектам.&lt;br /&gt;
&lt;br /&gt;
Как правило количество кластеров, на которые нужно разбить объекты, несравнимо меньше количества объектов, поэтому распараллеливание в большинстве существующих реализаций происходит по объектам: обработка объектов по возможности равномерно распределяются по кластерам. Теоретически (если считать передачу данных между процессорами мгновенной) при наличии неограниченного числа процессоров сложность алгоритма составит &amp;lt;math&amp;gt;O(M^2 * K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* Целое неотрицательное число &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
* Значения координат объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов с &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; координатами каждый.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;N * M&amp;lt;/math&amp;gt; вещественных чисел (если координаты объектов - вещественные числа), &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целое неотрицательное число.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор длины &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - для каждого объекта указан номер кластера, к которому он отнесен. Объект относится по результатам работы алгоритма тому кластеру, вероятность принадлежности которому (значение соответствующей скрытой переменной) максимальна.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; целых неотрицательных чисел.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
=== Преимущества и недостатки ===&lt;br /&gt;
EM-алгоритм обладает следующими преимуществами и недостатками&amp;lt;ref&amp;gt;EM алгоритм, его модификации и обобщения. machinelearning.ru [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]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Преимущества:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Слабо чувствителен к выбросам&lt;br /&gt;
# Прост в реализации&lt;br /&gt;
# Быстро сходится при удачном выборе начальных значений параметров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Неустойчив к выбору начальных значений параметров - от них зависит как скорость сходимости, так и результат работы: алгоритм может сойтись к локальному экстремуму функции правдоподобия, который может быть существенно ниже глобального.&lt;br /&gt;
# Алгоритм не находит оптимальное количество кластеров. Количество кластеров, на которые нужно разбить множество объектов, является параметром алгоритма.&lt;br /&gt;
# При большой размерности пространства объектов выдвинутое предположение о модели их распределения может быть некорректным.&lt;br /&gt;
&lt;br /&gt;
=== Влияние структуры матрицы ковариации на форму кластера ===&lt;br /&gt;
&lt;br /&gt;
[[file:DifferentCovariance.png|thumb|center|800px|Рисунок 6: Влияние структуры матрицы ковариации на форму кластеров для двумерного случая. a) - матрицы ковариации являются диагональными, b) - матрицы ковариации произвольны. &amp;lt;ref&amp;gt;Mathworks: Clustering Using Gaussian Mixture Models [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 6 наглядно показывает, что при диагональной форме матриц ковариации полуоси эллипса (в общем случае - эллипсоида), соответствующего распределению объектов, отнесенных кластеру, параллельны осям координат объектов. В противном случае полуоси могут располагаться произвольным образом.&lt;br /&gt;
&lt;br /&gt;
=== Общие свойства ===&lt;br /&gt;
[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] EM алгоритма равна &amp;lt;math&amp;gt;M * K * it&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - размерность объекта, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров, а &amp;lt;math&amp;gt;it&amp;lt;/math&amp;gt; - количество итераций. &lt;br /&gt;
&lt;br /&gt;
EM-алгоритм является итерационным, и число итераций в общем случае не фиксировано: оно зависит от условий остановки, начальных приближений и расположения объектов. Поэтому этот алгоритм &#039;&#039;недетерминированный&#039;&#039;. По тем же причинам EM-алгоритм является &#039;&#039;неустойчивым&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
=== Инициализация параметров распределений ===&lt;br /&gt;
Наиболее распространены 3 способа инициализации центров распределений для EM алгоритма:&lt;br /&gt;
# центр распределения совпадает со случайно выбранным объектом &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
# все наблюдения распределяются по кластерам случайным образом, а затем для каждого кластера пересчитывается цент соответствующего распределения&lt;br /&gt;
# центры кластеров получаются в результате работы алгоритма k-means. Использование такой инициализации оправдано тем, что k-means требует меньших вычислительных затрат и быстрее сходится&amp;lt;ref&amp;gt;EM алгоритм (пример) machinelearning.ru [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])&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Многие статьи&amp;lt;ref name=FREERIDE&amp;gt;Leonid Glimcher, Gagan Agrawal. Parallelising EM Algorithm on a Cluster of SMPs [http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CV&amp;gt;López-de-Teruel P. E., García J. M., Acacio; The Parallel EM Algorithm and its Applications in Computer Vision [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=MULTITHREAD&amp;gt;Sharon X. Lee, Kaleb L. Leemaqz, Geoffrey J. McLachlan. A simple multithreaded implementation of the EM algorithm for mixture models [https://arxiv.org/pdf/1606.02054.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CUDA&amp;gt;Araújo, G.F., H.T. Macedo, M.T. Chella, C.A.E. Montesco and M.V.O. Medeiros. PARALLEL IMPLEMENTATION OF EXPECTATION-MAXIMISATION ALGORITHM FOR THE TRAINING OF GAUSSIAN MIXTURE MODELS [https://ri.ufs.br/bitstream/123456789/1764/1/ExpectationMaximisationAlgorithm.pdf]&amp;lt;/ref&amp;gt;, в которых представлены параллельные реализации EM алгоритма, описывают помимо использующихся программных и аппаратных решений результаты проведенных экспериментов с данными. В качестве примера в этом разделе будут рассмотрены результаты эксперементов, проведенных со связующим программным обеспечением (&#039;&#039;middleware&#039;&#039;) FREERIDE&amp;lt;ref&amp;gt;Leonid Glimchera, Ruoming Jinb, Gagan Agrawala. Middleware for data mining applications on clusters and grids [http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf]&amp;lt;/ref&amp;gt; (FRamework for Rapid Implementation of Datamining Engines), обеспечивающим возможность распараллеливания как для систем с общей памятью (в частности, симметричных мультипроцессорных систем), так и для систем с распределенной памятью.&lt;br /&gt;
&lt;br /&gt;
Эксперименты проводились на кластере машин Pentium 700MHz связанных при помощи Myrinet&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Myrinet&amp;lt;/ref&amp;gt; LANai 7.0 на трех наборах данных: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;а)&#039;&#039;&#039; 3.3 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; 6.2 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; 12.5 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
Объекты представляют собой координаты точек 10-мерного пространства.&lt;br /&gt;
 &lt;br /&gt;
Количество машин в кластере варьировалось от 1 до 8, при этом на каждой машине запускалось до четырех параллельных потоков.&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов представлены на рисунках 7-9&amp;lt;ref name=FREERIDE/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_a.png|thumb|center|350px|Рисунок 7: набор данных a)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_b.png|thumb|center|357px|Рисунок 8: набор данных b)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_c.png|thumb|center|351px|Рисунок 9: набор данных c)]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что используемые в данном исследовании машины, как и коммуникационная среда, сейчас не используются и считаются устаревшими, результат приведенных экспериментов наглядно показывает, что EM алгоритм хорошо параллелится, зависимость ускорения от числа узлов в кластере с небольшим количеством узлов близка к линейной, а также, что скорость работы алгоритма линейно зависит от числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Данный раздел может быть дополнен&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Примеры библиотек, содержащих последовательную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV(C++)] ([https://github.com/opencv/opencv/blob/master/modules/ml/src/em.cpp github])&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab]&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html Scikit learn (Python)]&lt;br /&gt;
# [http://mlpack.org/index.html MLPack(C++)]&lt;br /&gt;
&lt;br /&gt;
Примеры библиотек, содержащих параллельную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Здесь приводятся как конкретные реализации, так и статьи, описывающие подходы к реализациям распараллеливания EM-алгоритма&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# [https://spark.apache.org/ Apache Spark]&lt;br /&gt;
# [http://accord-framework.net/ Accord.NET Framework (C#)]&lt;br /&gt;
# Статья об использовании FREERIDE middleware для распараллеливания EM алгоритма &amp;lt;ref name=FREERIDE/&amp;gt; &lt;br /&gt;
# [http://andrewharp.com/gmmcuda реализация с использованием CUDA]&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MPI еще одна реализация с использованием CUDA]&lt;br /&gt;
# статья об использовании параллельного EM алгоритма в задачах компьютерного зрения &amp;lt;ref name=CV/&amp;gt;&lt;br /&gt;
# статья о распараллеливании EM алгоритма с использованием CUDA &amp;lt;ref name=CUDA/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Noite</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:Noite/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=16924</id>
		<title>Участник:Noite/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:Noite/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=16924"/>
		<updated>2016-11-14T10:50:43Z</updated>

		<summary type="html">&lt;p&gt;Noite: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(N * M^2 * K)&amp;lt;/math&amp;gt; - одна итерация&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;N * M + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Noite|Зинченко Д.А.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
В задачах оптимизации EM-алгоритмом называют итеративную процедуру поиска численного значения экстремума какой-либо функции. В частности, в статистике этот алгоритм используется для оценки максимального правдоподобия. Впервые название EM-алгоритм было предложено в 1977 году&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;, однако его идеи были описаны и раньше&amp;lt;ref name=korolev&amp;gt;В.Ю.Королёв. ЕМ-алгоритм, его модификации и их применение к задаче разделения смесей вероятностных распределений.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм применяется для решения задач двух типов &amp;lt;ref name=korolev/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Анализ неполных данных (данных с пропусками). &lt;br /&gt;
# Оценка максимального правдоподобия в случае, если функцию правдоподобия трудно исследовать аналитически. В этом случае введение набора скрытых переменных может существенно упростить задачу.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к задачам второго типа. В данной статье рассматривается следующая постановка задачи кластеризации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;Дано множество из N объектов, каждый из которых представляет собой точку в M-мерном метрическом пространстве. Каждому измерению пространства соответствует некоторое свойство объекта. Необходимо разбить это множество на K подмножеств (кластеров) так, чтобы, чтобы элементы каждого подмножества существенно отличались по свойствам от элементов других подмножеств.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование алгоритма EM подразумевает следующее &#039;&#039;предположение об объектах&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Пусть объекты, которые необходимо разбить на кластеры, появляются случайным образом и независимо друг от друга согласно вероятностному распределению, равному смеси (линейной комбинации) распределений кластеров. В данной статье в дальнейшем будет считаться, что распределение каждого кластера является многомерным нормальным распределением с произвольной матрицей ковариации - наиболее часто используемое предположение.&lt;br /&gt;
&lt;br /&gt;
Тогда каждый объект принадлежит каждому кластеру, но с разной вероятностью. EM-алгоритм итеративно оценивает параметры распределений кластеров, максимизируя логарифмическую функцию максимального правдоподобия. После окончания работы алгоритма объект будет отнесен к кластеру, вероятность принадлежности которому максимальна. Вводимый набор скрытых переменных для каждого объекта - вероятности того, что объект принадлежит каждому из кластеров.&lt;br /&gt;
&lt;br /&gt;
Итерация алгоритма состоит из двух последовательных шагов.&lt;br /&gt;
&lt;br /&gt;
# (Expectation) Вычисляются новые ожидаемые значения скрытых переменных.&lt;br /&gt;
# (Maximization) Решается задача максимизации правдоподобия: По текущим значениям скрытых переменных обновляются параметры распределений для кластеров: математическое ожидание, дисперсия и вероятность появления объектов из кластера.&lt;br /&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;N&amp;lt;/math&amp;gt; - количество объектов, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - количество параметров объекта&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\gamma_{n,k}&amp;lt;/math&amp;gt; - значения скрытых переменных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N_{k}&amp;lt;/math&amp;gt; - количество элементов отнесенных к кластеру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{1},...,x_N&amp;lt;/math&amp;gt; - объекты&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Параметры распределений:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{1},...,w_{K}&amp;lt;/math&amp;gt; - вероятности появления объектов из кластеров (веса кластеров), &amp;lt;math&amp;gt;\sum_{k=1}^Kw_{k}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{1},...,\mu_{K}&amp;lt;/math&amp;gt; - центры гауссиан кластеров&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma_{1},...,\Sigma_{K}&amp;lt;/math&amp;gt; - матрицы ковариации гауссиан кластеров, каждая матрица имеет размерность &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Смесь распределений:&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; P(x) = \sum_{j=1}^Kw_jp(x|\mu_{j}, \Sigma_{j})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Цель алгоритма - вычислить параметры распределений, максимизирующих логарифм функции правдоподобия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\ln P(x|w,\mu,\Sigma)= \sum_{n=1}^N \ln \{ \sum_{k=1}^K w_{k}p(x_{n}|\mu_{k},\Sigma_{k})\}&amp;lt;/math&amp;gt;.&amp;lt;/center&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
* В начале работы алгоритма задаются параметры начального приближения:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{i} = 1/K, \mu_{i} = random(x_{j}), i=1..K, j=1..N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{j,j}^{k}=\frac{1}{NK}\sum_{i=1}^N(x_{i,j} - \mu_{k,j})^2, k=1..K, j=1..M&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Поскольку от начального приближения может сильно зависеть результат работы алгоритма, вместо инициализации кластеров случайными центрами, равными весами и диагональными матрицами ковариации, как в приведенных формулах, часто применяют другие способы (подробнее - в [[#Особенности реализации последовательного алгоритма | особенностях реализации]])&#039;&#039;&lt;br /&gt;
* Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
** E-шаг: используя текущее значение параметров &amp;lt;math&amp;gt;w_{1},...,w_{k};\mu_{1},...,\mu_{k};\Sigma^{1},...,\Sigma^{k}&amp;lt;/math&amp;gt;, вычисляем значение вектора скрытых переменных &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\gamma_{n,k}=\frac{w_{k}p(x_{n}|\mu_{k},\Sigma^{k})}{\sum_{j=1}^K w_{j}p(x_{n}|\mu_{j},\Sigma^{j})}, &amp;lt;/math&amp;gt; знаменатель дроби - нормировочный коэффициент&amp;lt;/center&amp;gt;&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p(x|\mu,\Sigma)=\frac{1}{{(2\pi)}^{\frac{N}{2}}\sqrt{|\Sigma|}}exp\biggl\{-\frac{1}{2}{(x-\mu)}^T{\Sigma}^{-1}(x-\mu)\biggr\}&amp;lt;/math&amp;gt; - плотность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерного нормального распределения&amp;lt;/center&amp;gt;&lt;br /&gt;
** М-шаг: переоценка параметров по текущим значениям скрытых переменных для &amp;lt;math&amp;gt;k = 1..K&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\mu^{new}_{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k}x_{n}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{new}^{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k} (x_{n}-\mu_{k}^{new})(x_{n}-\mu_{k}^{new})^{T}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{k}^{new}=\frac{N_{k}}{N}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;N_{k}=\sum_{n=1}^N \gamma_{n,k}&amp;lt;/math&amp;gt;.&amp;lt;/center&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;
Вычислительное ядро алгоритма состоит из двух шагов, повторяющихся каждую итерацию:&lt;br /&gt;
*Обновление скрытых переменных на основе текущих параметров распределений&lt;br /&gt;
*Обновление параметров кластеров: весов, центров и матриц ковариации&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании вычислительного ядра алгоритма]], основную часть алгоритма составляют итеративно проводимые макрооперации: Expectation шаг - вычисление новых значений скрытых переменных, Maximization шаг - обновление параметров кластеров. Макроструктура алгоритма представлена на рисунке 1:&lt;br /&gt;
[[file:EM_macro.png|thumb|center|600px|Рисунок 1: Макроструктура EM-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Примерная схема реализации EM алгоритма с предварительной обработкой матриц ковариации:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Инициализировать веса и центры кластеров;&lt;br /&gt;
Инициализировать матрицы ковариации;&lt;br /&gt;
&lt;br /&gt;
// Основной цикл&lt;br /&gt;
Пока условие остановки не выполнено&lt;br /&gt;
    // E-шаг&lt;br /&gt;
    В цикле для каждого кластера&lt;br /&gt;
        Вычислить определитель матрицы ковариации Sigma;&lt;br /&gt;
        Вычислить обратную матрицу матрице Sigma;&lt;br /&gt;
    В цикле для каждого объекта&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Вычислить и запомнить p(x | mu, Sigma) для текущего объекта и кластера;&lt;br /&gt;
        Просуммировать вычисленные p(x | mu, Sigma);&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Обновить скрытые переменные gamma;&lt;br /&gt;
    // M-шаг&lt;br /&gt;
    Обновить веса w;&lt;br /&gt;
    Обновить центры кластеров mu;&lt;br /&gt;
    Обновить матрицы ковариации Sigma;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления определителя произвольной матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления матрицы, обратной произвольной матрице ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации - &amp;lt;math&amp;gt;O(K * M^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С учетом заранее вычисленных определителей и обратных матриц сложность вычисления &amp;lt;math&amp;gt;p(x | \mu,\Sigma)&amp;lt;/math&amp;gt; составит: &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага E составит &amp;lt;math&amp;gt;O(N * M^2 * K + K * M^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления весов кластеров &amp;lt;math&amp;gt;O(K * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления центров кластеров &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления одной матрицы ковариации &amp;lt;math&amp;gt;O(N * M)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления всех матриц ковариации &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага M алгоритма - &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит &amp;lt;math&amp;gt;O(K * M^2 * N + K * M^3 + K * M * N)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В предположении, что размерность объектов много меньше их количества &amp;lt;math&amp;gt;M &amp;lt;&amp;lt; N&amp;lt;/math&amp;gt; получим сложность итерации &amp;lt;math&amp;gt;O(K * M^2 * N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большу́ю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее - вынесены за основной цикл шага E&amp;lt;ref name=ParallelEMComparissonGraphLab&amp;gt;Henggang Cui, Jinliang Wei, Wei Dai. Parallel Implementation of Expectation-Maximization for Fast Convergence - School of Computer Science, Carnegie Mellon University. [https://users.ece.cmu.edu/~hengganc/archive/report/final.pdf]&amp;lt;/ref&amp;gt;. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм&amp;lt;ref&amp;gt;Вячеслав Орешков. EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а суммарная сложность шага E и сложность всей итерации составит &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Макроструктура алгоритма представлена на рисунке 1 (см. [[#Макроструктура алгоритма|раздел 1.4]] статьи).&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 представлена схема вычислений E-шага алгоритма для одного объекта: для объекта &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и параметров &amp;lt;math&amp;gt;w_{j}, \mu_{j}, \Sigma_{j}, j=1..K&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются ненормированные значения скрытых переменных &amp;lt;math&amp;gt;g_{j}&amp;lt;/math&amp;gt;, нормировочный коэффициент &#039;&#039;normСoeff&#039;&#039;, и получаются итоговые значения &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step.png|thumb|center|400px|Рисунок 2: E-шаг EM алгоритма для одного объекта]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 представлена схема вычислений E-шага алгоритма для всех объектов: для объекта &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt; и параметров-векторов &amp;lt;math&amp;gt;w, \mu, \Sigma&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются значения скрытых переменных. &amp;lt;math&amp;gt;E_{i}, i=1..N&amp;lt;/math&amp;gt; - маркооперации, E-шаги для соответствующих объектов.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step_all.png|thumb|center|400px|Рисунок 3: E-шаг EM алгоритма для всех объектов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена схема вычислений M-шага алгоритма для одного кластера: для объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и скрытых переменных &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;, соответствующих степени принадлежности этих объектов кластеру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, согласно формулам шага M [[#Математическое описание алгоритма|раздела 1.2]] вычисляется нормировочный коэффициент &amp;lt;math&amp;gt;N_{j}&amp;lt;/math&amp;gt; и параметры этого кластера: вес &amp;lt;math&amp;gt;w_{j}^{new}&amp;lt;/math&amp;gt;, матрица ковариации &amp;lt;math&amp;gt;\Sigma_{j}^{new}&amp;lt;/math&amp;gt; и центр кластера &amp;lt;math&amp;gt;\mu_{j}^{new}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step.png|thumb|center|400px|Рисунок 4: M-шаг EM алгоритма для одного кластера]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена схема вычислений M-шага алгоритма для всех кластеров. &amp;lt;math&amp;gt;M_{j}, j=1..K&amp;lt;/math&amp;gt; соответствует макрооперации - M-шагу для соответствующего кластера и скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step_all.png|thumb|center|400px|Рисунок 5: M-шаг EM алгоритма для всех кластеров]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Из схем вычислений шагов E и M шагов алгоритма, приведенным в [[#Информационный граф|предыдущем разделе]], видно, что если размерность матрицы ковариации небольшая (тогда вычисление определителя и обратной матрицы матрице ковариации не является трудоемкой операцией), обе макрооперации EM алгоритма можно распараллеливать как по кластерам, так и по объектам.&lt;br /&gt;
&lt;br /&gt;
Как правило количество кластеров, на которые нужно разбить объекты, несравнимо меньше количества объектов, поэтому распараллеливание в большинстве существующих реализаций происходит по объектам: обработка объектов по возможности равномерно распределяются по кластерам. Теоретически (если считать передачу данных между процессорами мгновенной) при наличии неограниченного числа процессоров сложность алгоритма составит &amp;lt;math&amp;gt;O(M^2 * K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* Целое неотрицательное число &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
* Значения координат объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов с &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; координатами каждый.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;N * M&amp;lt;/math&amp;gt; вещественных чисел (если координаты объектов - вещественные числа), &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целое неотрицательное число.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор длины &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - для каждого объекта указан номер кластера, к которому он отнесен. Объект относится по результатам работы алгоритма тому кластеру, вероятность принадлежности которому (значение соответствующей скрытой переменной) максимальна.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; целых неотрицательных чисел.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
=== Преимущества и недостатки ===&lt;br /&gt;
EM-алгоритм обладает следующими преимуществами и недостатками&amp;lt;ref&amp;gt;EM алгоритм, его модификации и обобщения. machinelearning.ru [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]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Преимущества:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Слабо чувствителен к выбросам&lt;br /&gt;
# Прост в реализации&lt;br /&gt;
# Быстро сходится при удачном выборе начальных значений параметров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Неустойчив к выбору начальных значений параметров - от них зависит как скорость сходимости, так и результат работы: алгоритм может сойтись к локальному экстремуму функции правдоподобия, который может быть существенно ниже глобального.&lt;br /&gt;
# Алгоритм не находит оптимальное количество кластеров. Количество кластеров, на которые нужно разбить множество объектов, является параметром алгоритма.&lt;br /&gt;
# При большой размерности пространства объектов выдвинутое предположение о модели их распределения может быть некорректным.&lt;br /&gt;
&lt;br /&gt;
=== Влияние структуры матрицы ковариации на форму кластера ===&lt;br /&gt;
&lt;br /&gt;
[[file:DifferentCovariance.png|thumb|center|800px|Рисунок 6: Влияние структуры матрицы ковариации на форму кластеров для двумерного случая. a) - матрицы ковариации являются диагональными, b) - матрицы ковариации произвольны. &amp;lt;ref&amp;gt;Mathworks: Clustering Using Gaussian Mixture Models [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 6 наглядно показывает, что при диагональной форме матриц ковариации полуоси эллипса (в общем случае - эллипсоида), соответствующего распределению объектов, отнесенных кластеру, параллельны осям координат объектов. В противном случае полуоси могут располагаться произвольным образом.&lt;br /&gt;
&lt;br /&gt;
=== Общие свойства ===&lt;br /&gt;
[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] EM алгоритма равна &amp;lt;math&amp;gt;m * k * it&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - размерность объекта, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров, а &amp;lt;math&amp;gt;it&amp;lt;/math&amp;gt; - количество итераций. &lt;br /&gt;
&lt;br /&gt;
EM-алгоритм является итерационным, и число итераций в общем случае не фиксировано: оно зависит от условий остановки, начальных приближений и расположения объектов. Поэтому этот алгоритм &#039;&#039;недетерминированный&#039;&#039;. По тем же причинам EM-алгоритм является &#039;&#039;неустойчивым&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
=== Инициализация параметров распределений ===&lt;br /&gt;
Наиболее распространены 3 способа инициализации центров распределений для EM алгоритма:&lt;br /&gt;
# центр распределения совпадает со случайно выбранным объектом &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
# все наблюдения распределяются по кластерам случайным образом, а затем для каждого кластера пересчитывается цент соответствующего распределения&lt;br /&gt;
# центры кластеров получаются в результате работы алгоритма k-means. Использование такой инициализации оправдано тем, что k-means требует меньших вычислительных затрат и быстрее сходится&amp;lt;ref&amp;gt;EM алгоритм (пример) machinelearning.ru [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])&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Многие статьи&amp;lt;ref name=FREERIDE&amp;gt;Leonid Glimcher, Gagan Agrawal. Parallelising EM Algorithm on a Cluster of SMPs [http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CV&amp;gt;López-de-Teruel P. E., García J. M., Acacio; The Parallel EM Algorithm and its Applications in Computer Vision [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=MULTITHREAD&amp;gt;Sharon X. Lee, Kaleb L. Leemaqz, Geoffrey J. McLachlan. A simple multithreaded implementation of the EM algorithm for mixture models [https://arxiv.org/pdf/1606.02054.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CUDA&amp;gt;Araújo, G.F., H.T. Macedo, M.T. Chella, C.A.E. Montesco and M.V.O. Medeiros. PARALLEL IMPLEMENTATION OF EXPECTATION-MAXIMISATION ALGORITHM FOR THE TRAINING OF GAUSSIAN MIXTURE MODELS [https://ri.ufs.br/bitstream/123456789/1764/1/ExpectationMaximisationAlgorithm.pdf]&amp;lt;/ref&amp;gt;, в которых представлены параллельные реализации EM алгоритма, описывают помимо использующихся программных и аппаратных решений результаты проведенных экспериментов с данными. В качестве примера в этом разделе будут рассмотрены результаты эксперементов, проведенных со связующим программным обеспечением (&#039;&#039;middleware&#039;&#039;) FREERIDE&amp;lt;ref&amp;gt;Leonid Glimchera, Ruoming Jinb, Gagan Agrawala. Middleware for data mining applications on clusters and grids [http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf]&amp;lt;/ref&amp;gt; (FRamework for Rapid Implementation of Datamining Engines), обеспечивающим возможность распараллеливания как для систем с общей памятью (в частности, симметричных мультипроцессорных систем), так и для систем с распределенной памятью.&lt;br /&gt;
&lt;br /&gt;
Эксперименты проводились на кластере машин Pentium 700MHz связанных при помощи Myrinet&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Myrinet&amp;lt;/ref&amp;gt; LANai 7.0 на трех наборах данных: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;а)&#039;&#039;&#039; 3.3 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; 6.2 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; 12.5 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
Объекты представляют собой координаты точек 10-мерного пространства.&lt;br /&gt;
 &lt;br /&gt;
Количество машин в кластере варьировалось от 1 до 8, при этом на каждой машине запускалось до четырех параллельных потоков.&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов представлены на рисунках 7-9&amp;lt;ref name=FREERIDE/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_a.png|thumb|center|350px|Рисунок 7: набор данных a)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_b.png|thumb|center|357px|Рисунок 8: набор данных b)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_c.png|thumb|center|351px|Рисунок 9: набор данных c)]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что используемые в данном исследовании машины, как и коммуникационная среда, сейчас не используются и считаются устаревшими, результат приведенных экспериментов наглядно показывает, что EM алгоритм хорошо параллелится, зависимость ускорения от числа узлов в кластере с небольшим количеством узлов близка к линейной, а также, что скорость работы алгоритма линейно зависит от числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Данный раздел может быть дополнен&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Примеры библиотек, содержащих последовательную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV(C++)] ([https://github.com/opencv/opencv/blob/master/modules/ml/src/em.cpp github])&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab]&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html Scikit learn (Python)]&lt;br /&gt;
# [http://mlpack.org/index.html MLPack(C++)]&lt;br /&gt;
&lt;br /&gt;
Примеры библиотек, содержащих параллельную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Здесь приводятся как конкретные реализации, так и статьи, описывающие подходы к реализациям распараллеливания EM-алгоритма&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# [https://spark.apache.org/ Apache Spark]&lt;br /&gt;
# [http://accord-framework.net/ Accord.NET Framework (C#)]&lt;br /&gt;
# Статья об использовании FREERIDE middleware для распараллеливания EM алгоритма &amp;lt;ref name=FREERIDE/&amp;gt; &lt;br /&gt;
# [http://andrewharp.com/gmmcuda реализация с использованием CUDA]&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MPI еще одна реализация с использованием CUDA]&lt;br /&gt;
# статья об использовании параллельного EM алгоритма в задачах компьютерного зрения &amp;lt;ref name=CV/&amp;gt;&lt;br /&gt;
# статья о распараллеливании EM алгоритма с использованием CUDA &amp;lt;ref name=CUDA/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Noite</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:Noite/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=16921</id>
		<title>Участник:Noite/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:Noite/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=16921"/>
		<updated>2016-11-14T10:49:33Z</updated>

		<summary type="html">&lt;p&gt;Noite: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(N * M^2 * K)&amp;lt;/math&amp;gt; - одна итерация&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;N * M + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Noite|Зинченко Д.А.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
В задачах оптимизации EM-алгоритмом называют итеративную процедуру поиска численного значения экстремума какой-либо функции. В частности, в статистике этот алгоритм используется для оценки максимального правдоподобия. Впервые название EM-алгоритм было предложено в 1977 году&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;, однако его идеи были описаны и раньше&amp;lt;ref name=korolev&amp;gt;В.Ю.Королёв. ЕМ-алгоритм, его модификации и их применение к задаче разделения смесей вероятностных распределений.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм применяется для решения задач двух типов &amp;lt;ref name=korolev/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Анализ неполных данных (данных с пропусками). &lt;br /&gt;
# Оценка максимального правдоподобия в случае, если функцию правдоподобия трудно исследовать аналитически. В этом случае введение набора скрытых переменных может существенно упростить задачу.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к задачам второго типа. В данной статье рассматривается следующая постановка задачи кластеризации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;Дано множество из N объектов, каждый из которых представляет собой точку в M-мерном метрическом пространстве. Каждому измерению пространства соответствует некоторое свойство объекта. Необходимо разбить это множество на K подмножеств (кластеров) так, чтобы, чтобы элементы каждого подмножества существенно отличались по свойствам от элементов других подмножеств.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование алгоритма EM подразумевает следующее &#039;&#039;предположение об объектах&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Пусть объекты, которые необходимо разбить на кластеры, появляются случайным образом и независимо друг от друга согласно вероятностному распределению, равному смеси (линейной комбинации) распределений кластеров. В данной статье в дальнейшем будет считаться, что распределение каждого кластера является многомерным нормальным распределением с произвольной матрицей ковариации - наиболее часто используемое предположение.&lt;br /&gt;
&lt;br /&gt;
Тогда каждый объект принадлежит каждому кластеру, но с разной вероятностью. EM-алгоритм итеративно оценивает параметры распределений кластеров, максимизируя логарифмическую функцию максимального правдоподобия. После окончания работы алгоритма объект будет отнесен к кластеру, вероятность принадлежности которому максимальна. Вводимый набор скрытых переменных для каждого объекта - вероятности того, что объект принадлежит каждому из кластеров.&lt;br /&gt;
&lt;br /&gt;
Итерация алгоритма состоит из двух последовательных шагов.&lt;br /&gt;
&lt;br /&gt;
# (Expectation) Вычисляются новые ожидаемые значения скрытых переменных.&lt;br /&gt;
# (Maximization) Решается задача максимизации правдоподобия: По текущим значениям скрытых переменных обновляются параметры распределений для кластеров: математическое ожидание, дисперсия и вероятность появления объектов из кластера.&lt;br /&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;N&amp;lt;/math&amp;gt; - количество объектов, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - количество параметров объекта&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\gamma_{n,k}&amp;lt;/math&amp;gt; - значения скрытых переменных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N_{k}&amp;lt;/math&amp;gt; - количество элементов отнесенных к кластеру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{1},...,x_N&amp;lt;/math&amp;gt; - объекты&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Параметры распределений:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{1},...,w_{K}&amp;lt;/math&amp;gt; - вероятности появления объектов из кластеров (веса кластеров), &amp;lt;math&amp;gt;\sum_{k=1}^Kw_{k}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{1},...,\mu_{K}&amp;lt;/math&amp;gt; - центры гауссиан кластеров&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma_{1},...,\Sigma_{K}&amp;lt;/math&amp;gt; - матрицы ковариации гауссиан кластеров, каждая матрица имеет размерность &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Смесь распределений:&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; P(x) = \sum_{j=1}^Kw_jp(x|\mu_{j}, \Sigma_{j})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Цель алгоритма - вычислить параметры распределений, максимизирующих логарифм функции правдоподобия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\ln P(x|w,\mu,\Sigma)= \sum_{n=1}^N \ln \{ \sum_{k=1}^K w_{k}p(x_{n}|\mu_{k},\Sigma_{k})\}&amp;lt;/math&amp;gt;.&amp;lt;/center&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
* В начале работы алгоритма задаются параметры начального приближения:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{i} = 1/K, \mu_{i} = random(x_{j}), i=1..K, j=1..N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{j,j}^{k}=\frac{1}{NK}\sum_{i=1}^N(x_{i,j} - \mu_{k,j})^2, k=1..K, j=1..M&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Поскольку от начального приближения может сильно зависеть результат работы алгоритма, вместо инициализации кластеров случайными центрами, равными весами и диагональными матрицами ковариации, как в приведенных формулах, часто применяют другие способы (подробнее - в [[#Особенности реализации последовательного алгоритма | особенностях реализации]])&#039;&#039;&lt;br /&gt;
* Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
** E-шаг: используя текущее значение параметров &amp;lt;math&amp;gt;w_{1},...,w_{k};\mu_{1},...,\mu_{k};\Sigma^{1},...,\Sigma^{k}&amp;lt;/math&amp;gt;, вычисляем значение вектора скрытых переменных &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\gamma_{n,k}=\frac{w_{k}p(x_{n}|\mu_{k},\Sigma^{k})}{\sum_{j=1}^K w_{j}p(x_{n}|\mu_{j},\Sigma^{j})}, &amp;lt;/math&amp;gt; знаменатель дроби - нормировочный коэффициент&amp;lt;/center&amp;gt;&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p(x|\mu,\Sigma)=\frac{1}{{(2\pi)}^{\frac{N}{2}}\sqrt{|\Sigma|}}exp\biggl\{-\frac{1}{2}{(x-\mu)}^T{\Sigma}^{-1}(x-\mu)\biggr\}&amp;lt;/math&amp;gt; - плотность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерного нормального распределения&amp;lt;/center&amp;gt;&lt;br /&gt;
** М-шаг: переоценка параметров по текущим значениям скрытых переменных для &amp;lt;math&amp;gt;k = 1..K&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\mu^{new}_{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k}x_{n}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{new}^{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k} (x_{n}-\mu_{k}^{new})(x_{n}-\mu_{k}^{new})^{T}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{k}^{new}=\frac{N_{k}}{N}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;N_{k}=\sum_{n=1}^N \gamma_{n,k}&amp;lt;/math&amp;gt;.&amp;lt;/center&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;
Вычислительное ядро алгоритма состоит из двух шагов, повторяющихся каждую итерацию:&lt;br /&gt;
*Обновление скрытых переменных на основе текущих параметров распределений&lt;br /&gt;
*Обновление параметров кластеров: весов, центров и матриц ковариации&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании вычислительного ядра алгоритма]], основную часть алгоритма составляют итеративно проводимые макрооперации: Expectation шаг - вычисление новых значений скрытых переменных, Maximization шаг - обновление параметров кластеров. Макроструктура алгоритма представлена на рисунке 1:&lt;br /&gt;
[[file:EM_macro.png|thumb|center|600px|Рисунок 1: Макроструктура EM-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Примерная схема реализации EM алгоритма с предварительной обработкой матриц ковариации:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Инициализировать веса и центры кластеров;&lt;br /&gt;
Инициализировать матрицы ковариации;&lt;br /&gt;
&lt;br /&gt;
// Основной цикл&lt;br /&gt;
Пока условие остановки не выполнено&lt;br /&gt;
    // E-шаг&lt;br /&gt;
    В цикле для каждого кластера&lt;br /&gt;
        Вычислить определитель матрицы ковариации Sigma;&lt;br /&gt;
        Вычислить обратную матрицу матрице Sigma;&lt;br /&gt;
    В цикле для каждого объекта&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Вычислить и запомнить p(x | mu, Sigma) для текущего объекта и кластера;&lt;br /&gt;
        Просуммировать вычисленные p(x | mu, Sigma);&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Обновить скрытые переменные gamma;&lt;br /&gt;
    // M-шаг&lt;br /&gt;
    Обновить веса w;&lt;br /&gt;
    Обновить центры кластеров mu;&lt;br /&gt;
    Обновить матрицы ковариации Sigma;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления определителя произвольной матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления матрицы, обратной произвольной матрице ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации - &amp;lt;math&amp;gt;O(K * M^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С учетом заранее вычисленных определителей и обратных матриц сложность вычисления &amp;lt;math&amp;gt;p(x | \mu,\Sigma)&amp;lt;/math&amp;gt; составит: &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага E составит &amp;lt;math&amp;gt;O(N * M^2 * K + K * M^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления весов кластеров &amp;lt;math&amp;gt;O(K * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления центров кластеров &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления одной матрицы ковариации &amp;lt;math&amp;gt;O(N * M)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления всех матриц ковариации &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага M алгоритма - &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит &amp;lt;math&amp;gt;O(K * M^2 * N + K * M^3 + K * M * N)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В предположении, что размерность объектов много меньше их количества &amp;lt;math&amp;gt;M &amp;lt;&amp;lt; N&amp;lt;/math&amp;gt; получим сложность итерации &amp;lt;math&amp;gt;O(K * M^2 * N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большу́ю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее - вынесены за основной цикл шага E&amp;lt;ref name=ParallelEMComparissonGraphLab&amp;gt;Henggang Cui, Jinliang Wei, Wei Dai. Parallel Implementation of Expectation-Maximization for Fast Convergence - School of Computer Science, Carnegie Mellon University. [https://users.ece.cmu.edu/~hengganc/archive/report/final.pdf]&amp;lt;/ref&amp;gt;. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм&amp;lt;ref&amp;gt;Вячеслав Орешков. EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а суммарная сложность шага E и сложность всей итерации составит &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Макроструктура алгоритма представлена на рисунке 1 (см. [[#Макроструктура алгоритма|раздел 1.4]] статьи).&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 представлена схема вычислений E-шага алгоритма для одного объекта: для объекта &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и параметров &amp;lt;math&amp;gt;w_{j}, \mu_{j}, \Sigma_{j}, j=1..K&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются ненормированные значения скрытых переменных &amp;lt;math&amp;gt;g_{j}&amp;lt;/math&amp;gt;, нормировочный коэффициент &#039;&#039;normСoeff&#039;&#039;, и получаются итоговые значения &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step.png|thumb|center|400px|Рисунок 2: E-шаг EM алгоритма для одного объекта]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 представлена схема вычислений E-шага алгоритма для всех объектов: для объекта &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt; и параметров-векторов &amp;lt;math&amp;gt;w, \mu, \Sigma&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются значения скрытых переменных. &amp;lt;math&amp;gt;E_{i}, i=1..N&amp;lt;/math&amp;gt; - маркооперации, E-шаги для соответствующих объектов.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step_all.png|thumb|center|400px|Рисунок 3: E-шаг EM алгоритма для всех объектов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена схема вычислений M-шага алгоритма для одного кластера: для объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и скрытых переменных &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;, соответствующих степени принадлежности этих объектов кластеру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, согласно формулам шага M [[#Математическое описание алгоритма|раздела 1.2]] вычисляется нормировочный коэффициент &amp;lt;math&amp;gt;N_{j}&amp;lt;/math&amp;gt; и параметры этого кластера: вес &amp;lt;math&amp;gt;w_{j}^{new}&amp;lt;/math&amp;gt;, матрица ковариации &amp;lt;math&amp;gt;\Sigma_{j}^{new}&amp;lt;/math&amp;gt; и центр кластера &amp;lt;math&amp;gt;\mu_{j}^{new}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step.png|thumb|center|400px|Рисунок 4: M-шаг EM алгоритма для одного кластера]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена схема вычислений M-шага алгоритма для всех кластеров. &amp;lt;math&amp;gt;M_{j}, j=1..K&amp;lt;/math&amp;gt; соответствует макрооперации - M-шагу для соответствующего кластера и скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step_all.png|thumb|center|400px|Рисунок 5: M-шаг EM алгоритма для всех кластеров]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Из схем вычислений шагов E и M шагов алгоритма, приведенным в [[#Информационный граф|предыдущем разделе]], видно, что если размерность матрицы ковариации небольшая (тогда вычисление определителя и обратной матрицы матрице ковариации не является трудоемкой операцией), обе макрооперации EM алгоритма можно распараллеливать как по кластерам, так и по объектам.&lt;br /&gt;
&lt;br /&gt;
Как правило количество кластеров, на которые нужно разбить объекты, несравнимо меньше количества объектов, поэтому распараллеливание в большинстве существующих реализаций происходит по объектам: обработка объектов по возможности равномерно распределяются по кластерам. Теоретически (если считать передачу данных между процессорами мгновенной) при наличии неограниченного числа процессоров сложность алгоритма составит &amp;lt;math&amp;gt;O(M^2 * K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* Целое неотрицательное число &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
* Значения координат объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов с &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; координатами каждый.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;N * M&amp;lt;/math&amp;gt; вещественных чисел (если координаты объектов - вещественные числа), &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целое неотрицательное число.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор длины &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - для каждого объекта указан номер кластера, к которому он отнесен. Номер кластера определяется как тот, вероятность принадлежности которому максимальна.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; целых неотрицательных чисел.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
=== Преимущества и недостатки ===&lt;br /&gt;
EM-алгоритм обладает следующими преимуществами и недостатками&amp;lt;ref&amp;gt;EM алгоритм, его модификации и обобщения. machinelearning.ru [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]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Преимущества:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Слабо чувствителен к выбросам&lt;br /&gt;
# Прост в реализации&lt;br /&gt;
# Быстро сходится при удачном выборе начальных значений параметров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Неустойчив к выбору начальных значений параметров - от них зависит как скорость сходимости, так и результат работы: алгоритм может сойтись к локальному экстремуму функции правдоподобия, который может быть существенно ниже глобального.&lt;br /&gt;
# Алгоритм не находит оптимальное количество кластеров. Количество кластеров, на которые нужно разбить множество объектов, является параметром алгоритма.&lt;br /&gt;
# При большой размерности пространства объектов выдвинутое предположение о модели их распределения может быть некорректным.&lt;br /&gt;
&lt;br /&gt;
=== Влияние структуры матрицы ковариации на форму кластера ===&lt;br /&gt;
&lt;br /&gt;
[[file:DifferentCovariance.png|thumb|center|800px|Рисунок 6: Влияние структуры матрицы ковариации на форму кластеров для двумерного случая. a) - матрицы ковариации являются диагональными, b) - матрицы ковариации произвольны. &amp;lt;ref&amp;gt;Mathworks: Clustering Using Gaussian Mixture Models [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 6 наглядно показывает, что при диагональной форме матриц ковариации полуоси эллипса (в общем случае - эллипсоида), соответствующего распределению объектов, отнесенных кластеру, параллельны осям координат объектов. В противном случае полуоси могут располагаться произвольным образом.&lt;br /&gt;
&lt;br /&gt;
=== Общие свойства ===&lt;br /&gt;
[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] EM алгоритма равна &amp;lt;math&amp;gt;m * k * it&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - размерность объекта, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров, а &amp;lt;math&amp;gt;it&amp;lt;/math&amp;gt; - количество итераций. &lt;br /&gt;
&lt;br /&gt;
EM-алгоритм является итерационным, и число итераций в общем случае не фиксировано: оно зависит от условий остановки, начальных приближений и расположения объектов. Поэтому этот алгоритм &#039;&#039;недетерминированный&#039;&#039;. По тем же причинам EM-алгоритм является &#039;&#039;неустойчивым&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
=== Инициализация параметров распределений ===&lt;br /&gt;
Наиболее распространены 3 способа инициализации центров распределений для EM алгоритма:&lt;br /&gt;
# центр распределения совпадает со случайно выбранным объектом &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
# все наблюдения распределяются по кластерам случайным образом, а затем для каждого кластера пересчитывается цент соответствующего распределения&lt;br /&gt;
# центры кластеров получаются в результате работы алгоритма k-means. Использование такой инициализации оправдано тем, что k-means требует меньших вычислительных затрат и быстрее сходится&amp;lt;ref&amp;gt;EM алгоритм (пример) machinelearning.ru [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])&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Многие статьи&amp;lt;ref name=FREERIDE&amp;gt;Leonid Glimcher, Gagan Agrawal. Parallelising EM Algorithm on a Cluster of SMPs [http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CV&amp;gt;López-de-Teruel P. E., García J. M., Acacio; The Parallel EM Algorithm and its Applications in Computer Vision [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=MULTITHREAD&amp;gt;Sharon X. Lee, Kaleb L. Leemaqz, Geoffrey J. McLachlan. A simple multithreaded implementation of the EM algorithm for mixture models [https://arxiv.org/pdf/1606.02054.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CUDA&amp;gt;Araújo, G.F., H.T. Macedo, M.T. Chella, C.A.E. Montesco and M.V.O. Medeiros. PARALLEL IMPLEMENTATION OF EXPECTATION-MAXIMISATION ALGORITHM FOR THE TRAINING OF GAUSSIAN MIXTURE MODELS [https://ri.ufs.br/bitstream/123456789/1764/1/ExpectationMaximisationAlgorithm.pdf]&amp;lt;/ref&amp;gt;, в которых представлены параллельные реализации EM алгоритма, описывают помимо использующихся программных и аппаратных решений результаты проведенных экспериментов с данными. В качестве примера в этом разделе будут рассмотрены результаты эксперементов, проведенных со связующим программным обеспечением (&#039;&#039;middleware&#039;&#039;) FREERIDE&amp;lt;ref&amp;gt;Leonid Glimchera, Ruoming Jinb, Gagan Agrawala. Middleware for data mining applications on clusters and grids [http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf]&amp;lt;/ref&amp;gt; (FRamework for Rapid Implementation of Datamining Engines), обеспечивающим возможность распараллеливания как для систем с общей памятью (в частности, симметричных мультипроцессорных систем), так и для систем с распределенной памятью.&lt;br /&gt;
&lt;br /&gt;
Эксперименты проводились на кластере машин Pentium 700MHz связанных при помощи Myrinet&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Myrinet&amp;lt;/ref&amp;gt; LANai 7.0 на трех наборах данных: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;а)&#039;&#039;&#039; 3.3 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; 6.2 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; 12.5 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
Объекты представляют собой координаты точек 10-мерного пространства.&lt;br /&gt;
 &lt;br /&gt;
Количество машин в кластере варьировалось от 1 до 8, при этом на каждой машине запускалось до четырех параллельных потоков.&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов представлены на рисунках 7-9&amp;lt;ref name=FREERIDE/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_a.png|thumb|center|350px|Рисунок 7: набор данных a)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_b.png|thumb|center|357px|Рисунок 8: набор данных b)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_c.png|thumb|center|351px|Рисунок 9: набор данных c)]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что используемые в данном исследовании машины, как и коммуникационная среда, сейчас не используются и считаются устаревшими, результат приведенных экспериментов наглядно показывает, что EM алгоритм хорошо параллелится, зависимость ускорения от числа узлов в кластере с небольшим количеством узлов близка к линейной, а также, что скорость работы алгоритма линейно зависит от числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Данный раздел может быть дополнен&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Примеры библиотек, содержащих последовательную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV(C++)] ([https://github.com/opencv/opencv/blob/master/modules/ml/src/em.cpp github])&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab]&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html Scikit learn (Python)]&lt;br /&gt;
# [http://mlpack.org/index.html MLPack(C++)]&lt;br /&gt;
&lt;br /&gt;
Примеры библиотек, содержащих параллельную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Здесь приводятся как конкретные реализации, так и статьи, описывающие подходы к реализациям распараллеливания EM-алгоритма&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# [https://spark.apache.org/ Apache Spark]&lt;br /&gt;
# [http://accord-framework.net/ Accord.NET Framework (C#)]&lt;br /&gt;
# Статья об использовании FREERIDE middleware для распараллеливания EM алгоритма &amp;lt;ref name=FREERIDE/&amp;gt; &lt;br /&gt;
# [http://andrewharp.com/gmmcuda реализация с использованием CUDA]&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MPI еще одна реализация с использованием CUDA]&lt;br /&gt;
# статья об использовании параллельного EM алгоритма в задачах компьютерного зрения &amp;lt;ref name=CV/&amp;gt;&lt;br /&gt;
# статья о распараллеливании EM алгоритма с использованием CUDA &amp;lt;ref name=CUDA/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Noite</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:Noite/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=16915</id>
		<title>Участник:Noite/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:Noite/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=16915"/>
		<updated>2016-11-14T10:45:16Z</updated>

		<summary type="html">&lt;p&gt;Noite: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(N * M^2 * K)&amp;lt;/math&amp;gt; - одна итерация&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;N * M + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Noite|Зинченко Д.А.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
В задачах оптимизации EM-алгоритмом называют итеративную процедуру поиска численного значения экстремума какой-либо функции. В частности, в статистике этот алгоритм используется для оценки максимального правдоподобия. Впервые название EM-алгоритм было предложено в 1977 году&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;, однако его идеи были описаны и раньше&amp;lt;ref name=korolev&amp;gt;В.Ю.Королёв. ЕМ-алгоритм, его модификации и их применение к задаче разделения смесей вероятностных распределений.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм применяется для решения задач двух типов &amp;lt;ref name=korolev/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Анализ неполных данных (данных с пропусками). &lt;br /&gt;
# Оценка максимального правдоподобия в случае, если функцию правдоподобия трудно исследовать аналитически. В этом случае введение набора скрытых переменных может существенно упростить задачу.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к задачам второго типа. В данной статье рассматривается следующая постановка задачи кластеризации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;Дано множество из N объектов, каждый из которых представляет собой точку в M-мерном метрическом пространстве. Каждому измерению пространства соответствует некоторое свойство объекта. Необходимо разбить это множество на K подмножеств (кластеров) так, чтобы, чтобы элементы каждого подмножества существенно отличались по свойствам от элементов других подмножеств.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование алгоритма EM подразумевает следующее &#039;&#039;предположение об объектах&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Пусть объекты, которые необходимо разбить на кластеры, появляются случайным образом и независимо друг от друга согласно вероятностному распределению, равному смеси (линейной комбинации) распределений кластеров. В данной статье в дальнейшем будет считаться, что распределение каждого кластера является многомерным нормальным распределением с произвольной матрицей ковариации - наиболее часто используемое предположение.&lt;br /&gt;
&lt;br /&gt;
Тогда каждый объект принадлежит каждому кластеру, но с разной вероятностью. EM-алгоритм итеративно оценивает параметры распределений кластеров, максимизируя логарифмическую функцию максимального правдоподобия. После окончания работы алгоритма объект будет отнесен к кластеру, вероятность принадлежности которому максимальна. Вводимый набор скрытых переменных для каждого объекта - вероятности того, что объект принадлежит каждому из кластеров.&lt;br /&gt;
&lt;br /&gt;
Итерация алгоритма состоит из двух последовательных шагов.&lt;br /&gt;
&lt;br /&gt;
# (Expectation) Вычисляются новые ожидаемые значения скрытых переменных.&lt;br /&gt;
# (Maximization) Решается задача максимизации правдоподобия: По текущим значениям скрытых переменных обновляются параметры распределений для кластеров: математическое ожидание, дисперсия и вероятность появления объектов из кластера.&lt;br /&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;N&amp;lt;/math&amp;gt; - количество объектов, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - количество параметров объекта&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\gamma_{n,k}&amp;lt;/math&amp;gt; - значения скрытых переменных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N_{k}&amp;lt;/math&amp;gt; - количество элементов отнесенных к кластеру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{1},...,x_N&amp;lt;/math&amp;gt; - объекты&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Параметры распределений:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{1},...,w_{K}&amp;lt;/math&amp;gt; - вероятности появления объектов из кластеров (веса кластеров), &amp;lt;math&amp;gt;\sum_{k=1}^Kw_{k}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{1},...,\mu_{K}&amp;lt;/math&amp;gt; - центры гауссиан кластеров&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma_{1},...,\Sigma_{K}&amp;lt;/math&amp;gt; - матрицы ковариации гауссиан кластеров, каждая матрица имеет размерность &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Смесь распределений:&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; P(x) = \sum_{j=1}^Kw_jp(x|\mu_{j}, \Sigma_{j})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Цель алгоритма - вычислить параметры распределений, максимизирующих логарифм функции правдоподобия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\ln P(x|w,\mu,\Sigma)= \sum_{n=1}^N \ln \{ \sum_{k=1}^K w_{k}p(x_{n}|\mu_{k},\Sigma_{k})\}&amp;lt;/math&amp;gt;.&amp;lt;/center&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
* В начале работы алгоритма задаются параметры начального приближения:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{i} = 1/K, \mu_{i} = random(x_{j}), i=1..K, j=1..N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{j,j}^{k}=\frac{1}{NK}\sum_{i=1}^N(x_{i,j} - \mu_{k,j})^2, k=1..K, j=1..M&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Поскольку от начального приближения может сильно зависеть результат работы алгоритма, вместо инициализации кластеров случайными центрами, равными весами и диагональными матрицами ковариации, как в приведенных формулах, часто применяют другие способы (подробнее - в [[#Особенности реализации последовательного алгоритма | особенностях реализации]])&#039;&#039;&lt;br /&gt;
* Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
** E-шаг: используя текущее значение параметров &amp;lt;math&amp;gt;w_{1},...,w_{k};\mu_{1},...,\mu_{k};\Sigma^{1},...,\Sigma^{k}&amp;lt;/math&amp;gt;, вычисляем значение вектора скрытых переменных &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\gamma_{n,k}=\frac{w_{k}p(x_{n}|\mu_{k},\Sigma^{k})}{\sum_{j=1}^K w_{j}p(x_{n}|\mu_{j},\Sigma^{j})}, &amp;lt;/math&amp;gt; знаменатель дроби - нормировочный коэффициент&amp;lt;/center&amp;gt;&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p(x|\mu,\Sigma)=\frac{1}{{(2\pi)}^{\frac{N}{2}}\sqrt{|\Sigma|}}exp\biggl\{-\frac{1}{2}{(x-\mu)}^T{\Sigma}^{-1}(x-\mu)\biggr\}&amp;lt;/math&amp;gt; - плотность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерного нормального распределения&amp;lt;/center&amp;gt;&lt;br /&gt;
** М-шаг: переоценка параметров по текущим значениям скрытых переменных для &amp;lt;math&amp;gt;k = 1..K&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\mu^{new}_{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k}x_{n}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{new}^{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k} (x_{n}-\mu_{k}^{new})(x_{n}-\mu_{k}^{new})^{T}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{k}^{new}=\frac{N_{k}}{N}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;N_{k}=\sum_{n=1}^N \gamma_{n,k}&amp;lt;/math&amp;gt;.&amp;lt;/center&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;
Вычислительное ядро алгоритма состоит из двух шагов, повторяющихся каждую итерацию:&lt;br /&gt;
*Обновление скрытых переменных на основе текущих параметров распределений&lt;br /&gt;
*Обновление параметров кластеров: весов, центров и матриц ковариации&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании вычислительного ядра алгоритма]], основную часть алгоритма составляют итеративно проводимые макрооперации: Expectation шаг - вычисление новых значений скрытых переменных, Maximization шаг - обновление параметров кластеров. Макроструктура алгоритма представлена на рисунке 1:&lt;br /&gt;
[[file:EM_macro.png|thumb|center|600px|Рисунок 1: Макроструктура EM-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Примерная схема реализации EM алгоритма с предварительной обработкой матриц ковариации:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Инициализировать веса и центры кластеров;&lt;br /&gt;
Инициализировать матрицы ковариации;&lt;br /&gt;
&lt;br /&gt;
// Основной цикл&lt;br /&gt;
Пока условие остановки не выполнено&lt;br /&gt;
    // E-шаг&lt;br /&gt;
    В цикле для каждого кластера&lt;br /&gt;
        Вычислить определитель матрицы ковариации Sigma;&lt;br /&gt;
        Вычислить обратную матрицу матрице Sigma;&lt;br /&gt;
    В цикле для каждого объекта&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Вычислить и запомнить p(x | mu, Sigma) для текущего объекта и кластера;&lt;br /&gt;
        Просуммировать вычисленные p(x | mu, Sigma);&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Обновить скрытые переменные gamma;&lt;br /&gt;
    // M-шаг&lt;br /&gt;
    Обновить веса w;&lt;br /&gt;
    Обновить центры кластеров mu;&lt;br /&gt;
    Обновить матрицы ковариации Sigma;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления определителя произвольной матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления матрицы, обратной произвольной матрице ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации - &amp;lt;math&amp;gt;O(K * M^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С учетом заранее вычисленных определителей и обратных матриц сложность вычисления &amp;lt;math&amp;gt;p(x | \mu,\Sigma)&amp;lt;/math&amp;gt; составит: &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага E составит &amp;lt;math&amp;gt;O(N * M^2 * K + K * M^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления весов кластеров &amp;lt;math&amp;gt;O(K * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления центров кластеров &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления одной матрицы ковариации &amp;lt;math&amp;gt;O(N * M)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления всех матриц ковариации &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага M алгоритма - &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит &amp;lt;math&amp;gt;O(K * M^2 * N + K * M^3 + K * M * N)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В предположении, что размерность объектов много меньше их количества &amp;lt;math&amp;gt;M &amp;lt;&amp;lt; N&amp;lt;/math&amp;gt; получим сложность итерации &amp;lt;math&amp;gt;O(K * M^2 * N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большу́ю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее - вынесены за основной цикл шага E&amp;lt;ref name=ParallelEMComparissonGraphLab&amp;gt;Henggang Cui, Jinliang Wei, Wei Dai. Parallel Implementation of Expectation-Maximization for Fast Convergence - School of Computer Science, Carnegie Mellon University. [https://users.ece.cmu.edu/~hengganc/archive/report/final.pdf]&amp;lt;/ref&amp;gt;. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм&amp;lt;ref&amp;gt;Вячеслав Орешков. EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а суммарная сложность шага E и сложность всей итерации составит &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Макроструктура алгоритма представлена на рисунке 1 (см. [[#Макроструктура алгоритма|раздел 1.4]] статьи).&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 представлена схема вычислений E-шага алгоритма для одного объекта: для объекта &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и параметров &amp;lt;math&amp;gt;w_{j}, \mu_{j}, \Sigma_{j}, j=1..K&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются ненормированные значения скрытых переменных &amp;lt;math&amp;gt;g_{j}&amp;lt;/math&amp;gt;, нормировочный коэффициент &#039;&#039;normСoeff&#039;&#039;, и получаются итоговые значения &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step.png|thumb|center|400px|Рисунок 2: E-шаг EM алгоритма для одного объекта]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 представлена схема вычислений E-шага алгоритма для всех объектов: для объекта &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt; и параметров-векторов &amp;lt;math&amp;gt;w, \mu, \Sigma&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются значения скрытых переменных. &amp;lt;math&amp;gt;E_{i}, i=1..N&amp;lt;/math&amp;gt; - маркооперации, E-шаги для соответствующих объектов.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step_all.png|thumb|center|400px|Рисунок 3: E-шаг EM алгоритма для всех объектов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена схема вычислений M-шага алгоритма для одного кластера: для объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и скрытых переменных &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;, соответствующих степени принадлежности этих объектов кластеру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, согласно формулам шага M [[#Математическое описание алгоритма|раздела 1.2]] вычисляется нормировочный коэффициент &amp;lt;math&amp;gt;N_{j}&amp;lt;/math&amp;gt; и параметры этого кластера: вес &amp;lt;math&amp;gt;w_{j}^{new}&amp;lt;/math&amp;gt;, матрица ковариации &amp;lt;math&amp;gt;\Sigma_{j}^{new}&amp;lt;/math&amp;gt; и центр кластера &amp;lt;math&amp;gt;\mu_{j}^{new}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step.png|thumb|center|400px|Рисунок 4: M-шаг EM алгоритма для одного кластера]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена схема вычислений M-шага алгоритма для всех кластеров. &amp;lt;math&amp;gt;M_{j}, j=1..K&amp;lt;/math&amp;gt; соответствует макрооперации - M-шагу для соответствующего кластера и скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step_all.png|thumb|center|400px|Рисунок 5: M-шаг EM алгоритма для всех кластеров]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Из схем вычислений шагов E и M шагов алгоритма, приведенным в [[#Информационный граф|предыдущем разделе]], видно, что если размерность матрицы ковариации небольшая (тогда вычисление определителя и обратной матрицы матрице ковариации не является трудоемкой операцией), обе макрооперации EM алгоритма можно распараллеливать как по кластерам, так и по объектам.&lt;br /&gt;
&lt;br /&gt;
Как правило количество кластеров, на которые нужно разбить объекты, несравнимо меньше количества объектов, поэтому распараллеливание в большинстве существующих реализаций происходит по объектам: обработка объектов по возможности равномерно распределяются по кластерам. Теоретически (если считать передачу данных между процессорами мгновенной) при наличии неограниченного числа процессоров сложность алгоритма составит &amp;lt;math&amp;gt;O(M^2 * K)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* Целое неотрицательное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
* Значения координат объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; объектов с &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; координатами каждый.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;n * m&amp;lt;/math&amp;gt; вещественных чисел (если координаты объектов - вещественные числа), &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целое неотрицательное число.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - для каждого объекта указан номер кластера, к которому он отнесен.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; целых неотрицательных чисел. &lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
=== Преимущества и недостатки ===&lt;br /&gt;
EM-алгоритм обладает следующими преимуществами и недостатками&amp;lt;ref&amp;gt;EM алгоритм, его модификации и обобщения. machinelearning.ru [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]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Преимущества:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Слабо чувствителен к выбросам&lt;br /&gt;
# Прост в реализации&lt;br /&gt;
# Быстро сходится при удачном выборе начальных значений параметров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Неустойчив к выбору начальных значений параметров - от них зависит как скорость сходимости, так и результат работы: алгоритм может сойтись к локальному экстремуму функции правдоподобия, который может быть существенно ниже глобального.&lt;br /&gt;
# Алгоритм не находит оптимальное количество кластеров. Количество кластеров, на которые нужно разбить множество объектов, является параметром алгоритма.&lt;br /&gt;
# При большой размерности пространства объектов выдвинутое предположение о модели их распределения может быть некорректным.&lt;br /&gt;
&lt;br /&gt;
=== Влияние структуры матрицы ковариации на форму кластера ===&lt;br /&gt;
&lt;br /&gt;
[[file:DifferentCovariance.png|thumb|center|800px|Рисунок 6: Влияние структуры матрицы ковариации на форму кластеров для двумерного случая. a) - матрицы ковариации являются диагональными, b) - матрицы ковариации произвольны. &amp;lt;ref&amp;gt;Mathworks: Clustering Using Gaussian Mixture Models [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 6 наглядно показывает, что при диагональной форме матриц ковариации полуоси эллипса (в общем случае - эллипсоида), соответствующего распределению объектов, отнесенных кластеру, параллельны осям координат объектов. В противном случае полуоси могут располагаться произвольным образом.&lt;br /&gt;
&lt;br /&gt;
=== Общие свойства ===&lt;br /&gt;
[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] EM алгоритма равна &amp;lt;math&amp;gt;m * k * it&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - размерность объекта, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров, а &amp;lt;math&amp;gt;it&amp;lt;/math&amp;gt; - количество итераций. &lt;br /&gt;
&lt;br /&gt;
EM-алгоритм является итерационным, и число итераций в общем случае не фиксировано: оно зависит от условий остановки, начальных приближений и расположения объектов. Поэтому этот алгоритм &#039;&#039;недетерминированный&#039;&#039;. По тем же причинам EM-алгоритм является &#039;&#039;неустойчивым&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
=== Инициализация параметров распределений ===&lt;br /&gt;
Наиболее распространены 3 способа инициализации центров распределений для EM алгоритма:&lt;br /&gt;
# центр распределения совпадает со случайно выбранным объектом &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
# все наблюдения распределяются по кластерам случайным образом, а затем для каждого кластера пересчитывается цент соответствующего распределения&lt;br /&gt;
# центры кластеров получаются в результате работы алгоритма k-means. Использование такой инициализации оправдано тем, что k-means требует меньших вычислительных затрат и быстрее сходится&amp;lt;ref&amp;gt;EM алгоритм (пример) machinelearning.ru [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])&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Многие статьи&amp;lt;ref name=FREERIDE&amp;gt;Leonid Glimcher, Gagan Agrawal. Parallelising EM Algorithm on a Cluster of SMPs [http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CV&amp;gt;López-de-Teruel P. E., García J. M., Acacio; The Parallel EM Algorithm and its Applications in Computer Vision [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=MULTITHREAD&amp;gt;Sharon X. Lee, Kaleb L. Leemaqz, Geoffrey J. McLachlan. A simple multithreaded implementation of the EM algorithm for mixture models [https://arxiv.org/pdf/1606.02054.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CUDA&amp;gt;Araújo, G.F., H.T. Macedo, M.T. Chella, C.A.E. Montesco and M.V.O. Medeiros. PARALLEL IMPLEMENTATION OF EXPECTATION-MAXIMISATION ALGORITHM FOR THE TRAINING OF GAUSSIAN MIXTURE MODELS [https://ri.ufs.br/bitstream/123456789/1764/1/ExpectationMaximisationAlgorithm.pdf]&amp;lt;/ref&amp;gt;, в которых представлены параллельные реализации EM алгоритма, описывают помимо использующихся программных и аппаратных решений результаты проведенных экспериментов с данными. В качестве примера в этом разделе будут рассмотрены результаты эксперементов, проведенных со связующим программным обеспечением (&#039;&#039;middleware&#039;&#039;) FREERIDE&amp;lt;ref&amp;gt;Leonid Glimchera, Ruoming Jinb, Gagan Agrawala. Middleware for data mining applications on clusters and grids [http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf]&amp;lt;/ref&amp;gt; (FRamework for Rapid Implementation of Datamining Engines), обеспечивающим возможность распараллеливания как для систем с общей памятью (в частности, симметричных мультипроцессорных систем), так и для систем с распределенной памятью.&lt;br /&gt;
&lt;br /&gt;
Эксперименты проводились на кластере машин Pentium 700MHz связанных при помощи Myrinet&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Myrinet&amp;lt;/ref&amp;gt; LANai 7.0 на трех наборах данных: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;а)&#039;&#039;&#039; 3.3 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; 6.2 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; 12.5 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
Объекты представляют собой координаты точек 10-мерного пространства.&lt;br /&gt;
 &lt;br /&gt;
Количество машин в кластере варьировалось от 1 до 8, при этом на каждой машине запускалось до четырех параллельных потоков.&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов представлены на рисунках 7-9&amp;lt;ref name=FREERIDE/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_a.png|thumb|center|350px|Рисунок 7: набор данных a)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_b.png|thumb|center|357px|Рисунок 8: набор данных b)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_c.png|thumb|center|351px|Рисунок 9: набор данных c)]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что используемые в данном исследовании машины, как и коммуникационная среда, сейчас не используются и считаются устаревшими, результат приведенных экспериментов наглядно показывает, что EM алгоритм хорошо параллелится, зависимость ускорения от числа узлов в кластере с небольшим количеством узлов близка к линейной, а также, что скорость работы алгоритма линейно зависит от числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Данный раздел может быть дополнен&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Примеры библиотек, содержащих последовательную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV(C++)] ([https://github.com/opencv/opencv/blob/master/modules/ml/src/em.cpp github])&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab]&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html Scikit learn (Python)]&lt;br /&gt;
# [http://mlpack.org/index.html MLPack(C++)]&lt;br /&gt;
&lt;br /&gt;
Примеры библиотек, содержащих параллельную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Здесь приводятся как конкретные реализации, так и статьи, описывающие подходы к реализациям распараллеливания EM-алгоритма&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# [https://spark.apache.org/ Apache Spark]&lt;br /&gt;
# [http://accord-framework.net/ Accord.NET Framework (C#)]&lt;br /&gt;
# Статья об использовании FREERIDE middleware для распараллеливания EM алгоритма &amp;lt;ref name=FREERIDE/&amp;gt; &lt;br /&gt;
# [http://andrewharp.com/gmmcuda реализация с использованием CUDA]&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MPI еще одна реализация с использованием CUDA]&lt;br /&gt;
# статья об использовании параллельного EM алгоритма в задачах компьютерного зрения &amp;lt;ref name=CV/&amp;gt;&lt;br /&gt;
# статья о распараллеливании EM алгоритма с использованием CUDA &amp;lt;ref name=CUDA/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Noite</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:Noite/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=16913</id>
		<title>Участник:Noite/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:Noite/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=16913"/>
		<updated>2016-11-14T10:44:49Z</updated>

		<summary type="html">&lt;p&gt;Noite: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(N * M^2 * K)&amp;lt;/math&amp;gt; - одна итерация&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;N * M + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Noite|Зинченко Д.А.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
В задачах оптимизации EM-алгоритмом называют итеративную процедуру поиска численного значения экстремума какой-либо функции. В частности, в статистике этот алгоритм используется для оценки максимального правдоподобия. Впервые название EM-алгоритм было предложено в 1977 году&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;, однако его идеи были описаны и раньше&amp;lt;ref name=korolev&amp;gt;В.Ю.Королёв. ЕМ-алгоритм, его модификации и их применение к задаче разделения смесей вероятностных распределений.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм применяется для решения задач двух типов &amp;lt;ref name=korolev/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Анализ неполных данных (данных с пропусками). &lt;br /&gt;
# Оценка максимального правдоподобия в случае, если функцию правдоподобия трудно исследовать аналитически. В этом случае введение набора скрытых переменных может существенно упростить задачу.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к задачам второго типа. В данной статье рассматривается следующая постановка задачи кластеризации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;Дано множество из N объектов, каждый из которых представляет собой точку в M-мерном метрическом пространстве. Каждому измерению пространства соответствует некоторое свойство объекта. Необходимо разбить это множество на K подмножеств (кластеров) так, чтобы, чтобы элементы каждого подмножества существенно отличались по свойствам от элементов других подмножеств.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование алгоритма EM подразумевает следующее &#039;&#039;предположение об объектах&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Пусть объекты, которые необходимо разбить на кластеры, появляются случайным образом и независимо друг от друга согласно вероятностному распределению, равному смеси (линейной комбинации) распределений кластеров. В данной статье в дальнейшем будет считаться, что распределение каждого кластера является многомерным нормальным распределением с произвольной матрицей ковариации - наиболее часто используемое предположение.&lt;br /&gt;
&lt;br /&gt;
Тогда каждый объект принадлежит каждому кластеру, но с разной вероятностью. EM-алгоритм итеративно оценивает параметры распределений кластеров, максимизируя логарифмическую функцию максимального правдоподобия. После окончания работы алгоритма объект будет отнесен к кластеру, вероятность принадлежности которому максимальна. Вводимый набор скрытых переменных для каждого объекта - вероятности того, что объект принадлежит каждому из кластеров.&lt;br /&gt;
&lt;br /&gt;
Итерация алгоритма состоит из двух последовательных шагов.&lt;br /&gt;
&lt;br /&gt;
# (Expectation) Вычисляются новые ожидаемые значения скрытых переменных.&lt;br /&gt;
# (Maximization) Решается задача максимизации правдоподобия: По текущим значениям скрытых переменных обновляются параметры распределений для кластеров: математическое ожидание, дисперсия и вероятность появления объектов из кластера.&lt;br /&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;N&amp;lt;/math&amp;gt; - количество объектов, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - количество параметров объекта&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\gamma_{n,k}&amp;lt;/math&amp;gt; - значения скрытых переменных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N_{k}&amp;lt;/math&amp;gt; - количество элементов отнесенных к кластеру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{1},...,x_N&amp;lt;/math&amp;gt; - объекты&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Параметры распределений:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{1},...,w_{K}&amp;lt;/math&amp;gt; - вероятности появления объектов из кластеров (веса кластеров), &amp;lt;math&amp;gt;\sum_{k=1}^Kw_{k}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{1},...,\mu_{K}&amp;lt;/math&amp;gt; - центры гауссиан кластеров&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma_{1},...,\Sigma_{K}&amp;lt;/math&amp;gt; - матрицы ковариации гауссиан кластеров, каждая матрица имеет размерность &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Смесь распределений:&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; P(x) = \sum_{j=1}^Kw_jp(x|\mu_{j}, \Sigma_{j})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Цель алгоритма - вычислить параметры распределений, максимизирующих логарифм функции правдоподобия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\ln P(x|w,\mu,\Sigma)= \sum_{n=1}^N \ln \{ \sum_{k=1}^K w_{k}p(x_{n}|\mu_{k},\Sigma_{k})\}&amp;lt;/math&amp;gt;.&amp;lt;/center&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
* В начале работы алгоритма задаются параметры начального приближения:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{i} = 1/K, \mu_{i} = random(x_{j}), i=1..K, j=1..N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{j,j}^{k}=\frac{1}{NK}\sum_{i=1}^N(x_{i,j} - \mu_{k,j})^2, k=1..K, j=1..M&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Поскольку от начального приближения может сильно зависеть результат работы алгоритма, вместо инициализации кластеров случайными центрами, равными весами и диагональными матрицами ковариации, как в приведенных формулах, часто применяют другие способы (подробнее - в [[#Особенности реализации последовательного алгоритма | особенностях реализации]])&#039;&#039;&lt;br /&gt;
* Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
** E-шаг: используя текущее значение параметров &amp;lt;math&amp;gt;w_{1},...,w_{k};\mu_{1},...,\mu_{k};\Sigma^{1},...,\Sigma^{k}&amp;lt;/math&amp;gt;, вычисляем значение вектора скрытых переменных &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\gamma_{n,k}=\frac{w_{k}p(x_{n}|\mu_{k},\Sigma^{k})}{\sum_{j=1}^K w_{j}p(x_{n}|\mu_{j},\Sigma^{j})}, &amp;lt;/math&amp;gt; знаменатель дроби - нормировочный коэффициент&amp;lt;/center&amp;gt;&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p(x|\mu,\Sigma)=\frac{1}{{(2\pi)}^{\frac{N}{2}}\sqrt{|\Sigma|}}exp\biggl\{-\frac{1}{2}{(x-\mu)}^T{\Sigma}^{-1}(x-\mu)\biggr\}&amp;lt;/math&amp;gt; - плотность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерного нормального распределения&amp;lt;/center&amp;gt;&lt;br /&gt;
** М-шаг: переоценка параметров по текущим значениям скрытых переменных для &amp;lt;math&amp;gt;k = 1..K&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\mu^{new}_{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k}x_{n}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{new}^{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k} (x_{n}-\mu_{k}^{new})(x_{n}-\mu_{k}^{new})^{T}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{k}^{new}=\frac{N_{k}}{N}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;N_{k}=\sum_{n=1}^N \gamma_{n,k}&amp;lt;/math&amp;gt;.&amp;lt;/center&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;
Вычислительное ядро алгоритма состоит из двух шагов, повторяющихся каждую итерацию:&lt;br /&gt;
*Обновление скрытых переменных на основе текущих параметров распределений&lt;br /&gt;
*Обновление параметров кластеров: весов, центров и матриц ковариации&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании вычислительного ядра алгоритма]], основную часть алгоритма составляют итеративно проводимые макрооперации: Expectation шаг - вычисление новых значений скрытых переменных, Maximization шаг - обновление параметров кластеров. Макроструктура алгоритма представлена на рисунке 1:&lt;br /&gt;
[[file:EM_macro.png|thumb|center|600px|Рисунок 1: Макроструктура EM-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Примерная схема реализации EM алгоритма с предварительной обработкой матриц ковариации:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Инициализировать веса и центры кластеров;&lt;br /&gt;
Инициализировать матрицы ковариации;&lt;br /&gt;
&lt;br /&gt;
// Основной цикл&lt;br /&gt;
Пока условие остановки не выполнено&lt;br /&gt;
    // E-шаг&lt;br /&gt;
    В цикле для каждого кластера&lt;br /&gt;
        Вычислить определитель матрицы ковариации Sigma;&lt;br /&gt;
        Вычислить обратную матрицу матрице Sigma;&lt;br /&gt;
    В цикле для каждого объекта&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Вычислить и запомнить p(x | mu, Sigma) для текущего объекта и кластера;&lt;br /&gt;
        Просуммировать вычисленные p(x | mu, Sigma);&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Обновить скрытые переменные gamma;&lt;br /&gt;
    // M-шаг&lt;br /&gt;
    Обновить веса w;&lt;br /&gt;
    Обновить центры кластеров mu;&lt;br /&gt;
    Обновить матрицы ковариации Sigma;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления определителя произвольной матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления матрицы, обратной произвольной матрице ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации - &amp;lt;math&amp;gt;O(K * M^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С учетом заранее вычисленных определителей и обратных матриц сложность вычисления &amp;lt;math&amp;gt;p(x | \mu,\Sigma)&amp;lt;/math&amp;gt; составит: &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага E составит &amp;lt;math&amp;gt;O(N * M^2 * K + K * M^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления весов кластеров &amp;lt;math&amp;gt;O(K * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления центров кластеров &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления одной матрицы ковариации &amp;lt;math&amp;gt;O(N * M)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления всех матриц ковариации &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага M алгоритма - &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит &amp;lt;math&amp;gt;O(K * M^2 * N + K * M^3 + K * M * N)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В предположении, что размерность объектов много меньше их количества &amp;lt;math&amp;gt;M &amp;lt;&amp;lt; N&amp;lt;/math&amp;gt; получим сложность итерации &amp;lt;math&amp;gt;O(K * M^2 * N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большу́ю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее - вынесены за основной цикл шага E&amp;lt;ref name=ParallelEMComparissonGraphLab&amp;gt;Henggang Cui, Jinliang Wei, Wei Dai. Parallel Implementation of Expectation-Maximization for Fast Convergence - School of Computer Science, Carnegie Mellon University. [https://users.ece.cmu.edu/~hengganc/archive/report/final.pdf]&amp;lt;/ref&amp;gt;. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм&amp;lt;ref&amp;gt;Вячеслав Орешков. EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а суммарная сложность шага E и сложность всей итерации составит &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Макроструктура алгоритма представлена на рисунке 1 (см. [[#Макроструктура алгоритма|раздел 1.4]] статьи).&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 представлена схема вычислений E-шага алгоритма для одного объекта: для объекта &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и параметров &amp;lt;math&amp;gt;w_{j}, \mu_{j}, \Sigma_{j}, j=1..K&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются ненормированные значения скрытых переменных &amp;lt;math&amp;gt;g_{j}&amp;lt;/math&amp;gt;, нормировочный коэффициент &#039;&#039;normСoeff&#039;&#039;, и получаются итоговые значения &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step.png|thumb|center|400px|Рисунок 2: E-шаг EM алгоритма для одного объекта]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 представлена схема вычислений E-шага алгоритма для всех объектов: для объекта &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt; и параметров-векторов &amp;lt;math&amp;gt;w, \mu, \Sigma&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются значения скрытых переменных. &amp;lt;math&amp;gt;E_{i}, i=1..N&amp;lt;/math&amp;gt; - маркооперации, E-шаги для соответствующих объектов.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step_all.png|thumb|center|400px|Рисунок 3: E-шаг EM алгоритма для всех объектов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена схема вычислений M-шага алгоритма для одного кластера: для объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и скрытых переменных &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;, соответствующих степени принадлежности этих объектов кластеру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, согласно формулам шага M [[#Математическое описание алгоритма|раздела 1.2]] вычисляется нормировочный коэффициент &amp;lt;math&amp;gt;N_{j}&amp;lt;/math&amp;gt; и параметры этого кластера: вес &amp;lt;math&amp;gt;w_{j}^{new}&amp;lt;/math&amp;gt;, матрица ковариации &amp;lt;math&amp;gt;\Sigma_{j}^{new}&amp;lt;/math&amp;gt; и центр кластера &amp;lt;math&amp;gt;\mu_{j}^{new}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step.png|thumb|center|400px|Рисунок 4: M-шаг EM алгоритма для одного кластера]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена схема вычислений M-шага алгоритма для всех кластеров. &amp;lt;math&amp;gt;M_{j}, j=1..K&amp;lt;/math&amp;gt; соответствует макрооперации - M-шагу для соответствующего кластера и скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step_all.png|thumb|center|400px|Рисунок 5: M-шаг EM алгоритма для всех кластеров]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Из схем вычислений шагов E и M шагов алгоритма, приведенным в [[#Информационный граф|предыдущем разделе]], видно, что если размерность матрицы ковариации небольшая (тогда вычисление определителя и обратной матрицы матрице ковариации не является трудоемкой операцией), обе макрооперации EM алгоритма можно распараллеливать как по кластерам, так и по объектам.&lt;br /&gt;
&lt;br /&gt;
Как правило количество кластеров, на которые нужно разбить объекты, несравнимо меньше количества объектов, поэтому распараллеливание в большинстве существующих реализаций происходит по объектам: обработка объектов по возможности равномерно распределяются по кластерам. Теоретически (если считать передачу данных между процессорами мгновенной) при наличии неограниченного числа процессоров сложность алгоритма составит &amp;lt;math&amp;gt;O(m^2 * k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* Целое неотрицательное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
* Значения координат объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; объектов с &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; координатами каждый.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;n * m&amp;lt;/math&amp;gt; вещественных чисел (если координаты объектов - вещественные числа), &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целое неотрицательное число.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - для каждого объекта указан номер кластера, к которому он отнесен.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; целых неотрицательных чисел. &lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
=== Преимущества и недостатки ===&lt;br /&gt;
EM-алгоритм обладает следующими преимуществами и недостатками&amp;lt;ref&amp;gt;EM алгоритм, его модификации и обобщения. machinelearning.ru [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]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Преимущества:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Слабо чувствителен к выбросам&lt;br /&gt;
# Прост в реализации&lt;br /&gt;
# Быстро сходится при удачном выборе начальных значений параметров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Неустойчив к выбору начальных значений параметров - от них зависит как скорость сходимости, так и результат работы: алгоритм может сойтись к локальному экстремуму функции правдоподобия, который может быть существенно ниже глобального.&lt;br /&gt;
# Алгоритм не находит оптимальное количество кластеров. Количество кластеров, на которые нужно разбить множество объектов, является параметром алгоритма.&lt;br /&gt;
# При большой размерности пространства объектов выдвинутое предположение о модели их распределения может быть некорректным.&lt;br /&gt;
&lt;br /&gt;
=== Влияние структуры матрицы ковариации на форму кластера ===&lt;br /&gt;
&lt;br /&gt;
[[file:DifferentCovariance.png|thumb|center|800px|Рисунок 6: Влияние структуры матрицы ковариации на форму кластеров для двумерного случая. a) - матрицы ковариации являются диагональными, b) - матрицы ковариации произвольны. &amp;lt;ref&amp;gt;Mathworks: Clustering Using Gaussian Mixture Models [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 6 наглядно показывает, что при диагональной форме матриц ковариации полуоси эллипса (в общем случае - эллипсоида), соответствующего распределению объектов, отнесенных кластеру, параллельны осям координат объектов. В противном случае полуоси могут располагаться произвольным образом.&lt;br /&gt;
&lt;br /&gt;
=== Общие свойства ===&lt;br /&gt;
[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] EM алгоритма равна &amp;lt;math&amp;gt;m * k * it&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - размерность объекта, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров, а &amp;lt;math&amp;gt;it&amp;lt;/math&amp;gt; - количество итераций. &lt;br /&gt;
&lt;br /&gt;
EM-алгоритм является итерационным, и число итераций в общем случае не фиксировано: оно зависит от условий остановки, начальных приближений и расположения объектов. Поэтому этот алгоритм &#039;&#039;недетерминированный&#039;&#039;. По тем же причинам EM-алгоритм является &#039;&#039;неустойчивым&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
=== Инициализация параметров распределений ===&lt;br /&gt;
Наиболее распространены 3 способа инициализации центров распределений для EM алгоритма:&lt;br /&gt;
# центр распределения совпадает со случайно выбранным объектом &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
# все наблюдения распределяются по кластерам случайным образом, а затем для каждого кластера пересчитывается цент соответствующего распределения&lt;br /&gt;
# центры кластеров получаются в результате работы алгоритма k-means. Использование такой инициализации оправдано тем, что k-means требует меньших вычислительных затрат и быстрее сходится&amp;lt;ref&amp;gt;EM алгоритм (пример) machinelearning.ru [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])&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Многие статьи&amp;lt;ref name=FREERIDE&amp;gt;Leonid Glimcher, Gagan Agrawal. Parallelising EM Algorithm on a Cluster of SMPs [http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CV&amp;gt;López-de-Teruel P. E., García J. M., Acacio; The Parallel EM Algorithm and its Applications in Computer Vision [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=MULTITHREAD&amp;gt;Sharon X. Lee, Kaleb L. Leemaqz, Geoffrey J. McLachlan. A simple multithreaded implementation of the EM algorithm for mixture models [https://arxiv.org/pdf/1606.02054.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CUDA&amp;gt;Araújo, G.F., H.T. Macedo, M.T. Chella, C.A.E. Montesco and M.V.O. Medeiros. PARALLEL IMPLEMENTATION OF EXPECTATION-MAXIMISATION ALGORITHM FOR THE TRAINING OF GAUSSIAN MIXTURE MODELS [https://ri.ufs.br/bitstream/123456789/1764/1/ExpectationMaximisationAlgorithm.pdf]&amp;lt;/ref&amp;gt;, в которых представлены параллельные реализации EM алгоритма, описывают помимо использующихся программных и аппаратных решений результаты проведенных экспериментов с данными. В качестве примера в этом разделе будут рассмотрены результаты эксперементов, проведенных со связующим программным обеспечением (&#039;&#039;middleware&#039;&#039;) FREERIDE&amp;lt;ref&amp;gt;Leonid Glimchera, Ruoming Jinb, Gagan Agrawala. Middleware for data mining applications on clusters and grids [http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf]&amp;lt;/ref&amp;gt; (FRamework for Rapid Implementation of Datamining Engines), обеспечивающим возможность распараллеливания как для систем с общей памятью (в частности, симметричных мультипроцессорных систем), так и для систем с распределенной памятью.&lt;br /&gt;
&lt;br /&gt;
Эксперименты проводились на кластере машин Pentium 700MHz связанных при помощи Myrinet&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Myrinet&amp;lt;/ref&amp;gt; LANai 7.0 на трех наборах данных: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;а)&#039;&#039;&#039; 3.3 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; 6.2 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; 12.5 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
Объекты представляют собой координаты точек 10-мерного пространства.&lt;br /&gt;
 &lt;br /&gt;
Количество машин в кластере варьировалось от 1 до 8, при этом на каждой машине запускалось до четырех параллельных потоков.&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов представлены на рисунках 7-9&amp;lt;ref name=FREERIDE/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_a.png|thumb|center|350px|Рисунок 7: набор данных a)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_b.png|thumb|center|357px|Рисунок 8: набор данных b)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_c.png|thumb|center|351px|Рисунок 9: набор данных c)]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что используемые в данном исследовании машины, как и коммуникационная среда, сейчас не используются и считаются устаревшими, результат приведенных экспериментов наглядно показывает, что EM алгоритм хорошо параллелится, зависимость ускорения от числа узлов в кластере с небольшим количеством узлов близка к линейной, а также, что скорость работы алгоритма линейно зависит от числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Данный раздел может быть дополнен&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Примеры библиотек, содержащих последовательную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV(C++)] ([https://github.com/opencv/opencv/blob/master/modules/ml/src/em.cpp github])&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab]&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html Scikit learn (Python)]&lt;br /&gt;
# [http://mlpack.org/index.html MLPack(C++)]&lt;br /&gt;
&lt;br /&gt;
Примеры библиотек, содержащих параллельную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Здесь приводятся как конкретные реализации, так и статьи, описывающие подходы к реализациям распараллеливания EM-алгоритма&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# [https://spark.apache.org/ Apache Spark]&lt;br /&gt;
# [http://accord-framework.net/ Accord.NET Framework (C#)]&lt;br /&gt;
# Статья об использовании FREERIDE middleware для распараллеливания EM алгоритма &amp;lt;ref name=FREERIDE/&amp;gt; &lt;br /&gt;
# [http://andrewharp.com/gmmcuda реализация с использованием CUDA]&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MPI еще одна реализация с использованием CUDA]&lt;br /&gt;
# статья об использовании параллельного EM алгоритма в задачах компьютерного зрения &amp;lt;ref name=CV/&amp;gt;&lt;br /&gt;
# статья о распараллеливании EM алгоритма с использованием CUDA &amp;lt;ref name=CUDA/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Noite</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:Noite/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=16908</id>
		<title>Участник:Noite/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:Noite/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=16908"/>
		<updated>2016-11-14T10:41:29Z</updated>

		<summary type="html">&lt;p&gt;Noite: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(N * M^2 * K)&amp;lt;/math&amp;gt; - одна итерация&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;N * M + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Noite|Зинченко Д.А.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
В задачах оптимизации EM-алгоритмом называют итеративную процедуру поиска численного значения экстремума какой-либо функции. В частности, в статистике этот алгоритм используется для оценки максимального правдоподобия. Впервые название EM-алгоритм было предложено в 1977 году&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;, однако его идеи были описаны и раньше&amp;lt;ref name=korolev&amp;gt;В.Ю.Королёв. ЕМ-алгоритм, его модификации и их применение к задаче разделения смесей вероятностных распределений.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм применяется для решения задач двух типов &amp;lt;ref name=korolev/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Анализ неполных данных (данных с пропусками). &lt;br /&gt;
# Оценка максимального правдоподобия в случае, если функцию правдоподобия трудно исследовать аналитически. В этом случае введение набора скрытых переменных может существенно упростить задачу.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к задачам второго типа. В данной статье рассматривается следующая постановка задачи кластеризации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;Дано множество из N объектов, каждый из которых представляет собой точку в M-мерном метрическом пространстве. Каждому измерению пространства соответствует некоторое свойство объекта. Необходимо разбить это множество на K подмножеств (кластеров) так, чтобы, чтобы элементы каждого подмножества существенно отличались по свойствам от элементов других подмножеств.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование алгоритма EM подразумевает следующее &#039;&#039;предположение об объектах&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Пусть объекты, которые необходимо разбить на кластеры, появляются случайным образом и независимо друг от друга согласно вероятностному распределению, равному смеси (линейной комбинации) распределений кластеров. В данной статье в дальнейшем будет считаться, что распределение каждого кластера является многомерным нормальным распределением с произвольной матрицей ковариации - наиболее часто используемое предположение.&lt;br /&gt;
&lt;br /&gt;
Тогда каждый объект принадлежит каждому кластеру, но с разной вероятностью. EM-алгоритм итеративно оценивает параметры распределений кластеров, максимизируя логарифмическую функцию максимального правдоподобия. После окончания работы алгоритма объект будет отнесен к кластеру, вероятность принадлежности которому максимальна. Вводимый набор скрытых переменных для каждого объекта - вероятности того, что объект принадлежит каждому из кластеров.&lt;br /&gt;
&lt;br /&gt;
Итерация алгоритма состоит из двух последовательных шагов.&lt;br /&gt;
&lt;br /&gt;
# (Expectation) Вычисляются новые ожидаемые значения скрытых переменных.&lt;br /&gt;
# (Maximization) Решается задача максимизации правдоподобия: По текущим значениям скрытых переменных обновляются параметры распределений для кластеров: математическое ожидание, дисперсия и вероятность появления объектов из кластера.&lt;br /&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;N&amp;lt;/math&amp;gt; - количество объектов, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - количество параметров объекта&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\gamma_{n,k}&amp;lt;/math&amp;gt; - значения скрытых переменных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N_{k}&amp;lt;/math&amp;gt; - количество элементов отнесенных к кластеру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{1},...,x_N&amp;lt;/math&amp;gt; - объекты&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Параметры распределений:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{1},...,w_{K}&amp;lt;/math&amp;gt; - вероятности появления объектов из кластеров (веса кластеров), &amp;lt;math&amp;gt;\sum_{k=1}^Kw_{k}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{1},...,\mu_{K}&amp;lt;/math&amp;gt; - центры гауссиан кластеров&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma_{1},...,\Sigma_{K}&amp;lt;/math&amp;gt; - матрицы ковариации гауссиан кластеров, каждая матрица имеет размерность &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Смесь распределений:&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; P(x) = \sum_{j=1}^Kw_jp(x|\mu_{j}, \Sigma_{j})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Цель алгоритма - вычислить параметры распределений, максимизирующих логарифм функции правдоподобия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\ln P(x|w,\mu,\Sigma)= \sum_{n=1}^N \ln \{ \sum_{k=1}^K w_{k}p(x_{n}|\mu_{k},\Sigma_{k})\}&amp;lt;/math&amp;gt;.&amp;lt;/center&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
* В начале работы алгоритма задаются параметры начального приближения:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{i} = 1/K, \mu_{i} = random(x_{j}), i=1..K, j=1..N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{j,j}^{k}=\frac{1}{NK}\sum_{i=1}^N(x_{i,j} - \mu_{k,j})^2, k=1..K, j=1..M&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Поскольку от начального приближения может сильно зависеть результат работы алгоритма, вместо инициализации кластеров случайными центрами, равными весами и диагональными матрицами ковариации, как в приведенных формулах, часто применяют другие способы (подробнее - в [[#Особенности реализации последовательного алгоритма | особенностях реализации]])&#039;&#039;&lt;br /&gt;
* Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
** E-шаг: используя текущее значение параметров &amp;lt;math&amp;gt;w_{1},...,w_{k};\mu_{1},...,\mu_{k};\Sigma^{1},...,\Sigma^{k}&amp;lt;/math&amp;gt;, вычисляем значение вектора скрытых переменных &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\gamma_{n,k}=\frac{w_{k}p(x_{n}|\mu_{k},\Sigma^{k})}{\sum_{j=1}^K w_{j}p(x_{n}|\mu_{j},\Sigma^{j})}, &amp;lt;/math&amp;gt; знаменатель дроби - нормировочный коэффициент&amp;lt;/center&amp;gt;&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p(x|\mu,\Sigma)=\frac{1}{{(2\pi)}^{\frac{N}{2}}\sqrt{|\Sigma|}}exp\biggl\{-\frac{1}{2}{(x-\mu)}^T{\Sigma}^{-1}(x-\mu)\biggr\}&amp;lt;/math&amp;gt; - плотность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерного нормального распределения&amp;lt;/center&amp;gt;&lt;br /&gt;
** М-шаг: переоценка параметров по текущим значениям скрытых переменных для &amp;lt;math&amp;gt;k = 1..K&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\mu^{new}_{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k}x_{n}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{new}^{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k} (x_{n}-\mu_{k}^{new})(x_{n}-\mu_{k}^{new})^{T}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{k}^{new}=\frac{N_{k}}{N}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;N_{k}=\sum_{n=1}^N \gamma_{n,k}&amp;lt;/math&amp;gt;.&amp;lt;/center&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;
Вычислительное ядро алгоритма состоит из двух шагов, повторяющихся каждую итерацию:&lt;br /&gt;
*Обновление скрытых переменных на основе текущих параметров распределений&lt;br /&gt;
*Обновление параметров кластеров: весов, центров и матриц ковариации&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании вычислительного ядра алгоритма]], основную часть алгоритма составляют итеративно проводимые макрооперации: Expectation шаг - вычисление новых значений скрытых переменных, Maximization шаг - обновление параметров кластеров. Макроструктура алгоритма представлена на рисунке 1:&lt;br /&gt;
[[file:EM_macro.png|thumb|center|600px|Рисунок 1: Макроструктура EM-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Примерная схема реализации EM алгоритма с предварительной обработкой матриц ковариации:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Инициализировать веса и центры кластеров;&lt;br /&gt;
Инициализировать матрицы ковариации;&lt;br /&gt;
&lt;br /&gt;
// Основной цикл&lt;br /&gt;
Пока условие остановки не выполнено&lt;br /&gt;
    // E-шаг&lt;br /&gt;
    В цикле для каждого кластера&lt;br /&gt;
        Вычислить определитель матрицы ковариации Sigma;&lt;br /&gt;
        Вычислить обратную матрицу матрице Sigma;&lt;br /&gt;
    В цикле для каждого объекта&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Вычислить и запомнить p(x | mu, Sigma) для текущего объекта и кластера;&lt;br /&gt;
        Просуммировать вычисленные p(x | mu, Sigma);&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Обновить скрытые переменные gamma;&lt;br /&gt;
    // M-шаг&lt;br /&gt;
    Обновить веса w;&lt;br /&gt;
    Обновить центры кластеров mu;&lt;br /&gt;
    Обновить матрицы ковариации Sigma;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления определителя произвольной матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления матрицы, обратной произвольной матрице ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации - &amp;lt;math&amp;gt;O(K * M^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С учетом заранее вычисленных определителей и обратных матриц сложность вычисления &amp;lt;math&amp;gt;p(x | \mu,\Sigma)&amp;lt;/math&amp;gt; составит: &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага E составит &amp;lt;math&amp;gt;O(N * M^2 * K + K * M^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления весов кластеров &amp;lt;math&amp;gt;O(K * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления центров кластеров &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления одной матрицы ковариации &amp;lt;math&amp;gt;O(N * M)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления всех матриц ковариации &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага M алгоритма - &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит &amp;lt;math&amp;gt;O(K * M^2 * N + K * M^3 + K * M * N)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В предположении, что размерность объектов много меньше их количества &amp;lt;math&amp;gt;M &amp;lt;&amp;lt; N&amp;lt;/math&amp;gt; получим сложность итерации &amp;lt;math&amp;gt;O(K * M^2 * N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большу́ю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее - вынесены за основной цикл шага E&amp;lt;ref name=ParallelEMComparissonGraphLab&amp;gt;Henggang Cui, Jinliang Wei, Wei Dai. Parallel Implementation of Expectation-Maximization for Fast Convergence - School of Computer Science, Carnegie Mellon University. [https://users.ece.cmu.edu/~hengganc/archive/report/final.pdf]&amp;lt;/ref&amp;gt;. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм&amp;lt;ref&amp;gt;Вячеслав Орешков. EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а суммарная сложность шага E и сложность всей итерации составит &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Макроструктура алгоритма представлена на рисунке 1 (см. [[#Макроструктура алгоритма|раздел 1.4]] статьи).&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 представлена схема вычислений E-шага алгоритма для одного объекта: для объекта &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и параметров &amp;lt;math&amp;gt;w_{j}, \mu_{j}, \Sigma_{j}, j=1..k&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются ненормированные значения скрытых переменных &amp;lt;math&amp;gt;g_{j}&amp;lt;/math&amp;gt;, нормировочный коэффициент &#039;&#039;normСoeff&#039;&#039;, и получаются итоговые значения &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step.png|thumb|center|400px|Рисунок 2: E-шаг EM алгоритма для одного объекта]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 представлена схема вычислений E-шага алгоритма для всех объектов: для объекта &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt; и параметров-векторов &amp;lt;math&amp;gt;w, \mu, \Sigma&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются значения скрытых переменных. &amp;lt;math&amp;gt;E_{i}, i=1..n&amp;lt;/math&amp;gt; - маркооперации, E-шаги для соответствующих объектов.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step_all.png|thumb|center|400px|Рисунок 3: E-шаг EM алгоритма для всех объектов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена схема вычислений M-шага алгоритма для одного кластера: для объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и скрытых переменных &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;, соответствующих степени принадлежности этих объектов кластеру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, согласно формулам шага M [[#Математическое описание алгоритма|раздела 1.2]] вычисляется нормировочный коэффициент &amp;lt;math&amp;gt;N_{j}&amp;lt;/math&amp;gt; и параметры этого кластера: вес &amp;lt;math&amp;gt;w_{j}^{new}&amp;lt;/math&amp;gt;, матрица ковариации &amp;lt;math&amp;gt;\Sigma_{j}^{new}&amp;lt;/math&amp;gt; и центр кластера &amp;lt;math&amp;gt;\mu_{j}^{new}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step.png|thumb|center|400px|Рисунок 4: M-шаг EM алгоритма для одного кластера]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена схема вычислений M-шага алгоритма для всех кластеров. &amp;lt;math&amp;gt;M_{j}, j=1..k&amp;lt;/math&amp;gt; соответствует макрооперации - M-шагу для соответствующего кластера и скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step_all.png|thumb|center|400px|Рисунок 5: M-шаг EM алгоритма для всех кластеров]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Из схем вычислений шагов E и M шагов алгоритма, приведенным в [[#Информационный граф|предыдущем разделе]], видно, что если размерность матрицы ковариации небольшая (тогда вычисление определителя и обратной матрицы матрице ковариации не является трудоемкой операцией), обе макрооперации EM алгоритма можно распараллеливать как по кластерам, так и по объектам.&lt;br /&gt;
&lt;br /&gt;
Как правило количество кластеров, на которые нужно разбить объекты, несравнимо меньше количества объектов, поэтому распараллеливание в большинстве существующих реализаций происходит по объектам: обработка объектов по возможности равномерно распределяются по кластерам. Теоретически (если считать передачу данных между процессорами мгновенной) при наличии неограниченного числа процессоров сложность алгоритма составит &amp;lt;math&amp;gt;O(m^2 * k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* Целое неотрицательное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
* Значения координат объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; объектов с &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; координатами каждый.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;n * m&amp;lt;/math&amp;gt; вещественных чисел (если координаты объектов - вещественные числа), &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целое неотрицательное число.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - для каждого объекта указан номер кластера, к которому он отнесен.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; целых неотрицательных чисел. &lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
=== Преимущества и недостатки ===&lt;br /&gt;
EM-алгоритм обладает следующими преимуществами и недостатками&amp;lt;ref&amp;gt;EM алгоритм, его модификации и обобщения. machinelearning.ru [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]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Преимущества:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Слабо чувствителен к выбросам&lt;br /&gt;
# Прост в реализации&lt;br /&gt;
# Быстро сходится при удачном выборе начальных значений параметров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Неустойчив к выбору начальных значений параметров - от них зависит как скорость сходимости, так и результат работы: алгоритм может сойтись к локальному экстремуму функции правдоподобия, который может быть существенно ниже глобального.&lt;br /&gt;
# Алгоритм не находит оптимальное количество кластеров. Количество кластеров, на которые нужно разбить множество объектов, является параметром алгоритма.&lt;br /&gt;
# При большой размерности пространства объектов выдвинутое предположение о модели их распределения может быть некорректным.&lt;br /&gt;
&lt;br /&gt;
=== Влияние структуры матрицы ковариации на форму кластера ===&lt;br /&gt;
&lt;br /&gt;
[[file:DifferentCovariance.png|thumb|center|800px|Рисунок 6: Влияние структуры матрицы ковариации на форму кластеров для двумерного случая. a) - матрицы ковариации являются диагональными, b) - матрицы ковариации произвольны. &amp;lt;ref&amp;gt;Mathworks: Clustering Using Gaussian Mixture Models [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 6 наглядно показывает, что при диагональной форме матриц ковариации полуоси эллипса (в общем случае - эллипсоида), соответствующего распределению объектов, отнесенных кластеру, параллельны осям координат объектов. В противном случае полуоси могут располагаться произвольным образом.&lt;br /&gt;
&lt;br /&gt;
=== Общие свойства ===&lt;br /&gt;
[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] EM алгоритма равна &amp;lt;math&amp;gt;m * k * it&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - размерность объекта, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров, а &amp;lt;math&amp;gt;it&amp;lt;/math&amp;gt; - количество итераций. &lt;br /&gt;
&lt;br /&gt;
EM-алгоритм является итерационным, и число итераций в общем случае не фиксировано: оно зависит от условий остановки, начальных приближений и расположения объектов. Поэтому этот алгоритм &#039;&#039;недетерминированный&#039;&#039;. По тем же причинам EM-алгоритм является &#039;&#039;неустойчивым&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
=== Инициализация параметров распределений ===&lt;br /&gt;
Наиболее распространены 3 способа инициализации центров распределений для EM алгоритма:&lt;br /&gt;
# центр распределения совпадает со случайно выбранным объектом &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
# все наблюдения распределяются по кластерам случайным образом, а затем для каждого кластера пересчитывается цент соответствующего распределения&lt;br /&gt;
# центры кластеров получаются в результате работы алгоритма k-means. Использование такой инициализации оправдано тем, что k-means требует меньших вычислительных затрат и быстрее сходится&amp;lt;ref&amp;gt;EM алгоритм (пример) machinelearning.ru [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])&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Многие статьи&amp;lt;ref name=FREERIDE&amp;gt;Leonid Glimcher, Gagan Agrawal. Parallelising EM Algorithm on a Cluster of SMPs [http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CV&amp;gt;López-de-Teruel P. E., García J. M., Acacio; The Parallel EM Algorithm and its Applications in Computer Vision [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=MULTITHREAD&amp;gt;Sharon X. Lee, Kaleb L. Leemaqz, Geoffrey J. McLachlan. A simple multithreaded implementation of the EM algorithm for mixture models [https://arxiv.org/pdf/1606.02054.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CUDA&amp;gt;Araújo, G.F., H.T. Macedo, M.T. Chella, C.A.E. Montesco and M.V.O. Medeiros. PARALLEL IMPLEMENTATION OF EXPECTATION-MAXIMISATION ALGORITHM FOR THE TRAINING OF GAUSSIAN MIXTURE MODELS [https://ri.ufs.br/bitstream/123456789/1764/1/ExpectationMaximisationAlgorithm.pdf]&amp;lt;/ref&amp;gt;, в которых представлены параллельные реализации EM алгоритма, описывают помимо использующихся программных и аппаратных решений результаты проведенных экспериментов с данными. В качестве примера в этом разделе будут рассмотрены результаты эксперементов, проведенных со связующим программным обеспечением (&#039;&#039;middleware&#039;&#039;) FREERIDE&amp;lt;ref&amp;gt;Leonid Glimchera, Ruoming Jinb, Gagan Agrawala. Middleware for data mining applications on clusters and grids [http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf]&amp;lt;/ref&amp;gt; (FRamework for Rapid Implementation of Datamining Engines), обеспечивающим возможность распараллеливания как для систем с общей памятью (в частности, симметричных мультипроцессорных систем), так и для систем с распределенной памятью.&lt;br /&gt;
&lt;br /&gt;
Эксперименты проводились на кластере машин Pentium 700MHz связанных при помощи Myrinet&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Myrinet&amp;lt;/ref&amp;gt; LANai 7.0 на трех наборах данных: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;а)&#039;&#039;&#039; 3.3 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; 6.2 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; 12.5 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
Объекты представляют собой координаты точек 10-мерного пространства.&lt;br /&gt;
 &lt;br /&gt;
Количество машин в кластере варьировалось от 1 до 8, при этом на каждой машине запускалось до четырех параллельных потоков.&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов представлены на рисунках 7-9&amp;lt;ref name=FREERIDE/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_a.png|thumb|center|350px|Рисунок 7: набор данных a)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_b.png|thumb|center|357px|Рисунок 8: набор данных b)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_c.png|thumb|center|351px|Рисунок 9: набор данных c)]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что используемые в данном исследовании машины, как и коммуникационная среда, сейчас не используются и считаются устаревшими, результат приведенных экспериментов наглядно показывает, что EM алгоритм хорошо параллелится, зависимость ускорения от числа узлов в кластере с небольшим количеством узлов близка к линейной, а также, что скорость работы алгоритма линейно зависит от числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Данный раздел может быть дополнен&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Примеры библиотек, содержащих последовательную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV(C++)] ([https://github.com/opencv/opencv/blob/master/modules/ml/src/em.cpp github])&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab]&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html Scikit learn (Python)]&lt;br /&gt;
# [http://mlpack.org/index.html MLPack(C++)]&lt;br /&gt;
&lt;br /&gt;
Примеры библиотек, содержащих параллельную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Здесь приводятся как конкретные реализации, так и статьи, описывающие подходы к реализациям распараллеливания EM-алгоритма&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# [https://spark.apache.org/ Apache Spark]&lt;br /&gt;
# [http://accord-framework.net/ Accord.NET Framework (C#)]&lt;br /&gt;
# Статья об использовании FREERIDE middleware для распараллеливания EM алгоритма &amp;lt;ref name=FREERIDE/&amp;gt; &lt;br /&gt;
# [http://andrewharp.com/gmmcuda реализация с использованием CUDA]&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MPI еще одна реализация с использованием CUDA]&lt;br /&gt;
# статья об использовании параллельного EM алгоритма в задачах компьютерного зрения &amp;lt;ref name=CV/&amp;gt;&lt;br /&gt;
# статья о распараллеливании EM алгоритма с использованием CUDA &amp;lt;ref name=CUDA/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Noite</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Noite&amp;diff=16903</id>
		<title>Обсуждение участника:Noite</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Noite&amp;diff=16903"/>
		<updated>2016-11-14T10:37:28Z</updated>

		<summary type="html">&lt;p&gt;Noite: /* Замечания к Участник:Noite/EM-алгоритм_кластеризации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Замечания к [[Участник:Noite/EM-алгоритм_кластеризации]] ==&lt;br /&gt;
&lt;br /&gt;
1) лишняя строка &amp;quot;Алгоритм кластеризации, основанный на максимизации ожидания (EM-алгоритм)&amp;quot; перед содержанием --- убрано&lt;br /&gt;
&lt;br /&gt;
2) отсутствует оценка высоты и ширины ЯПФ параллельного алгоритма во врезке в начале статьи --- врезка исправлена&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ниже - замечания второго рецензента&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
3) Во врезке так и не появилась информация по поводу параллельного алгоритма&lt;br /&gt;
&lt;br /&gt;
4) Из содержания нужно убрать ссылку [5] --- имеется ввиду из заголовка раздела? или подобную ссылку вообще нельзя использовать? пока ссылка перенесена из заголовка внутрь раздела&lt;br /&gt;
&lt;br /&gt;
5) В формулировке задачи в п1.1 нет разъяснения параметра m --- формулировка задачи кластеризации изменена&lt;br /&gt;
&lt;br /&gt;
6) В п1.2 парметры m, n, k почему-то превратились в M, N, K --- параметры m,n,k изменены в п1.1 и во врезке на M,N,K соответственно (пока исправлено не полностью, нужно поправить в п1.2 и диаграммах)&lt;br /&gt;
&lt;br /&gt;
7) П 1.5. Как инициализируются скрытые переменные gamma? Выравнивание псевдокода местами нарушено. Слово &amp;quot;большУю&amp;quot; - здесь лучше использовать значок ударения --- слово большУю исправлено. Скрытые переменные могут быть инициализированы любым образом, поскольку первый E-шаг алгоритма их в любом случае перезапишет. Выравнивание псевдокода изменено.&lt;br /&gt;
&lt;br /&gt;
8) П 1.7 Информационный граф: на рисунке омега превратилась в w, гамма - в Y. --- в используемом редакторе изображений для гаммы использовался следующий символ: γ. То, что он похож на Y - визуальное совпадение. &lt;br /&gt;
&lt;br /&gt;
9)П 1.9 Выходные данные - сказано о векторе n. Поясните, какое значение он имеет в терминах алгоритма кластеризации.&lt;/div&gt;</summary>
		<author><name>Noite</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:Noite/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=16902</id>
		<title>Участник:Noite/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:Noite/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=16902"/>
		<updated>2016-11-14T10:37:12Z</updated>

		<summary type="html">&lt;p&gt;Noite: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(N * M^2 * K)&amp;lt;/math&amp;gt; - одна итерация&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;N * M + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Noite|Зинченко Д.А.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
В задачах оптимизации EM-алгоритмом называют итеративную процедуру поиска численного значения экстремума какой-либо функции. В частности, в статистике этот алгоритм используется для оценки максимального правдоподобия. Впервые название EM-алгоритм было предложено в 1977 году&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;, однако его идеи были описаны и раньше&amp;lt;ref name=korolev&amp;gt;В.Ю.Королёв. ЕМ-алгоритм, его модификации и их применение к задаче разделения смесей вероятностных распределений.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм применяется для решения задач двух типов &amp;lt;ref name=korolev/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Анализ неполных данных (данных с пропусками). &lt;br /&gt;
# Оценка максимального правдоподобия в случае, если функцию правдоподобия трудно исследовать аналитически. В этом случае введение набора скрытых переменных может существенно упростить задачу.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к задачам второго типа. В данной статье рассматривается следующая постановка задачи кластеризации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;Дано множество из N объектов, каждый из которых представляет собой точку в M-мерном метрическом пространстве. Каждому измерению пространства соответствует некоторое свойство объекта. Необходимо разбить это множество на K подмножеств (кластеров) так, чтобы, чтобы элементы каждого подмножества существенно отличались по свойствам от элементов других подмножеств.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование алгоритма EM подразумевает следующее &#039;&#039;предположение об объектах&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Пусть объекты, которые необходимо разбить на кластеры, появляются случайным образом и независимо друг от друга согласно вероятностному распределению, равному смеси (линейной комбинации) распределений кластеров. В данной статье в дальнейшем будет считаться, что распределение каждого кластера является многомерным нормальным распределением с произвольной матрицей ковариации - наиболее часто используемое предположение.&lt;br /&gt;
&lt;br /&gt;
Тогда каждый объект принадлежит каждому кластеру, но с разной вероятностью. EM-алгоритм итеративно оценивает параметры распределений кластеров, максимизируя логарифмическую функцию максимального правдоподобия. После окончания работы алгоритма объект будет отнесен к кластеру, вероятность принадлежности которому максимальна. Вводимый набор скрытых переменных для каждого объекта - вероятности того, что объект принадлежит каждому из кластеров.&lt;br /&gt;
&lt;br /&gt;
Итерация алгоритма состоит из двух последовательных шагов.&lt;br /&gt;
&lt;br /&gt;
# (Expectation) Вычисляются новые ожидаемые значения скрытых переменных.&lt;br /&gt;
# (Maximization) Решается задача максимизации правдоподобия: По текущим значениям скрытых переменных обновляются параметры распределений для кластеров: математическое ожидание, дисперсия и вероятность появления объектов из кластера.&lt;br /&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;N&amp;lt;/math&amp;gt; - количество объектов, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - количество параметров объекта&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\gamma_{n,k}&amp;lt;/math&amp;gt; - значения скрытых переменных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N_{k}&amp;lt;/math&amp;gt; - количество элементов отнесенных к соответствующему кластеру&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{1},...,x_n&amp;lt;/math&amp;gt; - объекты&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Параметры распределений:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{1},...,w_{k}&amp;lt;/math&amp;gt; - вероятности появления объектов из кластеров (веса кластеров), &amp;lt;math&amp;gt;\sum_{k=1}^Kw_{k}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{1},...,\mu_{k}&amp;lt;/math&amp;gt; - центры гауссиан кластеров&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma_{1},...,\Sigma_{k}&amp;lt;/math&amp;gt; - матрицы ковариации гауссиан кластеров, каждая матрица имеет размерность &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Смесь распределений:&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; P(x) = \sum_{j=1}^Kw_jp(x|\mu_{j}, \Sigma_{j})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Цель алгоритма - вычислить параметры распределений, максимизирующих логарифм функции правдоподобия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\ln P(x|w,\mu,\Sigma)= \sum_{n=1}^N \ln \{ \sum_{k=1}^K w_{k}p(x_{n}|\mu_{k},\Sigma_{k})\}&amp;lt;/math&amp;gt;.&amp;lt;/center&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
* В начале работы алгоритма задаются параметры начального приближения:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{i} = 1/K, \mu_{i} = random(x_{j}), i=1..K, j=1..N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{j,j}^{k}=\frac{1}{NK}\sum_{i=1}^N(x_{i,j} - \mu_{k,j})^2, k=1..K, j=1..M&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Поскольку от начального приближения может сильно зависеть результат работы алгоритма, вместо инициализации кластеров случайными центрами, равными весами и диагональными матрицами ковариации, как в приведенных формулах, часто применяют другие способы (подробнее - в [[#Особенности реализации последовательного алгоритма | особенностях реализации]])&#039;&#039;&lt;br /&gt;
* Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
** E-шаг: используя текущее значение параметров &amp;lt;math&amp;gt;w_{1},...,w_{k};\mu_{1},...,\mu_{k};\Sigma^{1},...,\Sigma^{k}&amp;lt;/math&amp;gt;, вычисляем значение вектора скрытых переменных &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\gamma_{n,k}=\frac{w_{k}p(x_{n}|\mu_{k},\Sigma^{k})}{\sum_{j=1}^K w_{j}p(x_{n}|\mu_{j},\Sigma^{j})}, &amp;lt;/math&amp;gt; знаменатель дроби - нормировочный коэффициент&amp;lt;/center&amp;gt;&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p(x|\mu,\Sigma)=\frac{1}{{(2\pi)}^{\frac{N}{2}}\sqrt{|\Sigma|}}exp\biggl\{-\frac{1}{2}{(x-\mu)}^T{\Sigma}^{-1}(x-\mu)\biggr\}&amp;lt;/math&amp;gt; - плотность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерного нормального распределения&amp;lt;/center&amp;gt;&lt;br /&gt;
** М-шаг: переоценка параметров по текущим значениям скрытых переменных для &amp;lt;math&amp;gt;k = 1..K&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\mu^{new}_{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k}x_{n}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{new}^{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k} (x_{n}-\mu_{k}^{new})(x_{n}-\mu_{k}^{new})^{T}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{k}^{new}=\frac{N_{k}}{N}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;N_{k}=\sum_{n=1}^N \gamma_{n,k}&amp;lt;/math&amp;gt;.&amp;lt;/center&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;
Вычислительное ядро алгоритма состоит из двух шагов, повторяющихся каждую итерацию:&lt;br /&gt;
*Обновление скрытых переменных на основе текущих параметров распределений&lt;br /&gt;
*Обновление параметров кластеров: весов, центров и матриц ковариации&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании вычислительного ядра алгоритма]], основную часть алгоритма составляют итеративно проводимые макрооперации: Expectation шаг - вычисление новых значений скрытых переменных, Maximization шаг - обновление параметров кластеров. Макроструктура алгоритма представлена на рисунке 1:&lt;br /&gt;
[[file:EM_macro.png|thumb|center|600px|Рисунок 1: Макроструктура EM-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Примерная схема реализации EM алгоритма с предварительной обработкой матриц ковариации:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Инициализировать веса и центры кластеров;&lt;br /&gt;
Инициализировать матрицы ковариации;&lt;br /&gt;
&lt;br /&gt;
// Основной цикл&lt;br /&gt;
Пока условие остановки не выполнено&lt;br /&gt;
    // E-шаг&lt;br /&gt;
    В цикле для каждого кластера&lt;br /&gt;
        Вычислить определитель матрицы ковариации Sigma;&lt;br /&gt;
        Вычислить обратную матрицу матрице Sigma;&lt;br /&gt;
    В цикле для каждого объекта&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Вычислить и запомнить p(x | mu, Sigma) для текущего объекта и кластера;&lt;br /&gt;
        Просуммировать вычисленные p(x | mu, Sigma);&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Обновить скрытые переменные gamma;&lt;br /&gt;
    // M-шаг&lt;br /&gt;
    Обновить веса w;&lt;br /&gt;
    Обновить центры кластеров mu;&lt;br /&gt;
    Обновить матрицы ковариации Sigma;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления определителя произвольной матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления матрицы, обратной произвольной матрице ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации - &amp;lt;math&amp;gt;O(K * M^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С учетом заранее вычисленных определителей и обратных матриц сложность вычисления &amp;lt;math&amp;gt;p(x | \mu,\Sigma)&amp;lt;/math&amp;gt; составит: &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага E составит &amp;lt;math&amp;gt;O(N * M^2 * K + K * M^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления весов кластеров &amp;lt;math&amp;gt;O(K * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления центров кластеров &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления одной матрицы ковариации &amp;lt;math&amp;gt;O(N * M)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления всех матриц ковариации &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага M алгоритма - &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит &amp;lt;math&amp;gt;O(K * M^2 * N + K * M^3 + K * M * N)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В предположении, что размерность объектов много меньше их количества &amp;lt;math&amp;gt;M &amp;lt;&amp;lt; N&amp;lt;/math&amp;gt; получим сложность итерации &amp;lt;math&amp;gt;O(K * M^2 * N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большу́ю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее - вынесены за основной цикл шага E&amp;lt;ref name=ParallelEMComparissonGraphLab&amp;gt;Henggang Cui, Jinliang Wei, Wei Dai. Parallel Implementation of Expectation-Maximization for Fast Convergence - School of Computer Science, Carnegie Mellon University. [https://users.ece.cmu.edu/~hengganc/archive/report/final.pdf]&amp;lt;/ref&amp;gt;. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм&amp;lt;ref&amp;gt;Вячеслав Орешков. EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а суммарная сложность шага E и сложность всей итерации составит &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Макроструктура алгоритма представлена на рисунке 1 (см. [[#Макроструктура алгоритма|раздел 1.4]] статьи).&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 представлена схема вычислений E-шага алгоритма для одного объекта: для объекта &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и параметров &amp;lt;math&amp;gt;w_{j}, \mu_{j}, \Sigma_{j}, j=1..k&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются ненормированные значения скрытых переменных &amp;lt;math&amp;gt;g_{j}&amp;lt;/math&amp;gt;, нормировочный коэффициент &#039;&#039;normСoeff&#039;&#039;, и получаются итоговые значения &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step.png|thumb|center|400px|Рисунок 2: E-шаг EM алгоритма для одного объекта]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 представлена схема вычислений E-шага алгоритма для всех объектов: для объекта &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt; и параметров-векторов &amp;lt;math&amp;gt;w, \mu, \Sigma&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются значения скрытых переменных. &amp;lt;math&amp;gt;E_{i}, i=1..n&amp;lt;/math&amp;gt; - маркооперации, E-шаги для соответствующих объектов.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step_all.png|thumb|center|400px|Рисунок 3: E-шаг EM алгоритма для всех объектов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена схема вычислений M-шага алгоритма для одного кластера: для объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и скрытых переменных &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;, соответствующих степени принадлежности этих объектов кластеру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, согласно формулам шага M [[#Математическое описание алгоритма|раздела 1.2]] вычисляется нормировочный коэффициент &amp;lt;math&amp;gt;N_{j}&amp;lt;/math&amp;gt; и параметры этого кластера: вес &amp;lt;math&amp;gt;w_{j}^{new}&amp;lt;/math&amp;gt;, матрица ковариации &amp;lt;math&amp;gt;\Sigma_{j}^{new}&amp;lt;/math&amp;gt; и центр кластера &amp;lt;math&amp;gt;\mu_{j}^{new}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step.png|thumb|center|400px|Рисунок 4: M-шаг EM алгоритма для одного кластера]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена схема вычислений M-шага алгоритма для всех кластеров. &amp;lt;math&amp;gt;M_{j}, j=1..k&amp;lt;/math&amp;gt; соответствует макрооперации - M-шагу для соответствующего кластера и скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step_all.png|thumb|center|400px|Рисунок 5: M-шаг EM алгоритма для всех кластеров]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Из схем вычислений шагов E и M шагов алгоритма, приведенным в [[#Информационный граф|предыдущем разделе]], видно, что если размерность матрицы ковариации небольшая (тогда вычисление определителя и обратной матрицы матрице ковариации не является трудоемкой операцией), обе макрооперации EM алгоритма можно распараллеливать как по кластерам, так и по объектам.&lt;br /&gt;
&lt;br /&gt;
Как правило количество кластеров, на которые нужно разбить объекты, несравнимо меньше количества объектов, поэтому распараллеливание в большинстве существующих реализаций происходит по объектам: обработка объектов по возможности равномерно распределяются по кластерам. Теоретически (если считать передачу данных между процессорами мгновенной) при наличии неограниченного числа процессоров сложность алгоритма составит &amp;lt;math&amp;gt;O(m^2 * k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* Целое неотрицательное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
* Значения координат объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; объектов с &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; координатами каждый.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;n * m&amp;lt;/math&amp;gt; вещественных чисел (если координаты объектов - вещественные числа), &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целое неотрицательное число.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - для каждого объекта указан номер кластера, к которому он отнесен.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; целых неотрицательных чисел. &lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
=== Преимущества и недостатки ===&lt;br /&gt;
EM-алгоритм обладает следующими преимуществами и недостатками&amp;lt;ref&amp;gt;EM алгоритм, его модификации и обобщения. machinelearning.ru [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]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Преимущества:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Слабо чувствителен к выбросам&lt;br /&gt;
# Прост в реализации&lt;br /&gt;
# Быстро сходится при удачном выборе начальных значений параметров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Неустойчив к выбору начальных значений параметров - от них зависит как скорость сходимости, так и результат работы: алгоритм может сойтись к локальному экстремуму функции правдоподобия, который может быть существенно ниже глобального.&lt;br /&gt;
# Алгоритм не находит оптимальное количество кластеров. Количество кластеров, на которые нужно разбить множество объектов, является параметром алгоритма.&lt;br /&gt;
# При большой размерности пространства объектов выдвинутое предположение о модели их распределения может быть некорректным.&lt;br /&gt;
&lt;br /&gt;
=== Влияние структуры матрицы ковариации на форму кластера ===&lt;br /&gt;
&lt;br /&gt;
[[file:DifferentCovariance.png|thumb|center|800px|Рисунок 6: Влияние структуры матрицы ковариации на форму кластеров для двумерного случая. a) - матрицы ковариации являются диагональными, b) - матрицы ковариации произвольны. &amp;lt;ref&amp;gt;Mathworks: Clustering Using Gaussian Mixture Models [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 6 наглядно показывает, что при диагональной форме матриц ковариации полуоси эллипса (в общем случае - эллипсоида), соответствующего распределению объектов, отнесенных кластеру, параллельны осям координат объектов. В противном случае полуоси могут располагаться произвольным образом.&lt;br /&gt;
&lt;br /&gt;
=== Общие свойства ===&lt;br /&gt;
[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] EM алгоритма равна &amp;lt;math&amp;gt;m * k * it&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - размерность объекта, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров, а &amp;lt;math&amp;gt;it&amp;lt;/math&amp;gt; - количество итераций. &lt;br /&gt;
&lt;br /&gt;
EM-алгоритм является итерационным, и число итераций в общем случае не фиксировано: оно зависит от условий остановки, начальных приближений и расположения объектов. Поэтому этот алгоритм &#039;&#039;недетерминированный&#039;&#039;. По тем же причинам EM-алгоритм является &#039;&#039;неустойчивым&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
=== Инициализация параметров распределений ===&lt;br /&gt;
Наиболее распространены 3 способа инициализации центров распределений для EM алгоритма:&lt;br /&gt;
# центр распределения совпадает со случайно выбранным объектом &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
# все наблюдения распределяются по кластерам случайным образом, а затем для каждого кластера пересчитывается цент соответствующего распределения&lt;br /&gt;
# центры кластеров получаются в результате работы алгоритма k-means. Использование такой инициализации оправдано тем, что k-means требует меньших вычислительных затрат и быстрее сходится&amp;lt;ref&amp;gt;EM алгоритм (пример) machinelearning.ru [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])&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Многие статьи&amp;lt;ref name=FREERIDE&amp;gt;Leonid Glimcher, Gagan Agrawal. Parallelising EM Algorithm on a Cluster of SMPs [http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CV&amp;gt;López-de-Teruel P. E., García J. M., Acacio; The Parallel EM Algorithm and its Applications in Computer Vision [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=MULTITHREAD&amp;gt;Sharon X. Lee, Kaleb L. Leemaqz, Geoffrey J. McLachlan. A simple multithreaded implementation of the EM algorithm for mixture models [https://arxiv.org/pdf/1606.02054.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CUDA&amp;gt;Araújo, G.F., H.T. Macedo, M.T. Chella, C.A.E. Montesco and M.V.O. Medeiros. PARALLEL IMPLEMENTATION OF EXPECTATION-MAXIMISATION ALGORITHM FOR THE TRAINING OF GAUSSIAN MIXTURE MODELS [https://ri.ufs.br/bitstream/123456789/1764/1/ExpectationMaximisationAlgorithm.pdf]&amp;lt;/ref&amp;gt;, в которых представлены параллельные реализации EM алгоритма, описывают помимо использующихся программных и аппаратных решений результаты проведенных экспериментов с данными. В качестве примера в этом разделе будут рассмотрены результаты эксперементов, проведенных со связующим программным обеспечением (&#039;&#039;middleware&#039;&#039;) FREERIDE&amp;lt;ref&amp;gt;Leonid Glimchera, Ruoming Jinb, Gagan Agrawala. Middleware for data mining applications on clusters and grids [http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf]&amp;lt;/ref&amp;gt; (FRamework for Rapid Implementation of Datamining Engines), обеспечивающим возможность распараллеливания как для систем с общей памятью (в частности, симметричных мультипроцессорных систем), так и для систем с распределенной памятью.&lt;br /&gt;
&lt;br /&gt;
Эксперименты проводились на кластере машин Pentium 700MHz связанных при помощи Myrinet&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Myrinet&amp;lt;/ref&amp;gt; LANai 7.0 на трех наборах данных: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;а)&#039;&#039;&#039; 3.3 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; 6.2 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; 12.5 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
Объекты представляют собой координаты точек 10-мерного пространства.&lt;br /&gt;
 &lt;br /&gt;
Количество машин в кластере варьировалось от 1 до 8, при этом на каждой машине запускалось до четырех параллельных потоков.&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов представлены на рисунках 7-9&amp;lt;ref name=FREERIDE/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_a.png|thumb|center|350px|Рисунок 7: набор данных a)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_b.png|thumb|center|357px|Рисунок 8: набор данных b)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_c.png|thumb|center|351px|Рисунок 9: набор данных c)]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что используемые в данном исследовании машины, как и коммуникационная среда, сейчас не используются и считаются устаревшими, результат приведенных экспериментов наглядно показывает, что EM алгоритм хорошо параллелится, зависимость ускорения от числа узлов в кластере с небольшим количеством узлов близка к линейной, а также, что скорость работы алгоритма линейно зависит от числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Данный раздел может быть дополнен&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Примеры библиотек, содержащих последовательную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV(C++)] ([https://github.com/opencv/opencv/blob/master/modules/ml/src/em.cpp github])&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab]&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html Scikit learn (Python)]&lt;br /&gt;
# [http://mlpack.org/index.html MLPack(C++)]&lt;br /&gt;
&lt;br /&gt;
Примеры библиотек, содержащих параллельную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Здесь приводятся как конкретные реализации, так и статьи, описывающие подходы к реализациям распараллеливания EM-алгоритма&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# [https://spark.apache.org/ Apache Spark]&lt;br /&gt;
# [http://accord-framework.net/ Accord.NET Framework (C#)]&lt;br /&gt;
# Статья об использовании FREERIDE middleware для распараллеливания EM алгоритма &amp;lt;ref name=FREERIDE/&amp;gt; &lt;br /&gt;
# [http://andrewharp.com/gmmcuda реализация с использованием CUDA]&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MPI еще одна реализация с использованием CUDA]&lt;br /&gt;
# статья об использовании параллельного EM алгоритма в задачах компьютерного зрения &amp;lt;ref name=CV/&amp;gt;&lt;br /&gt;
# статья о распараллеливании EM алгоритма с использованием CUDA &amp;lt;ref name=CUDA/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Noite</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:Noite/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=16901</id>
		<title>Участник:Noite/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:Noite/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=16901"/>
		<updated>2016-11-14T10:36:48Z</updated>

		<summary type="html">&lt;p&gt;Noite: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(N * M^2 * K)&amp;lt;/math&amp;gt; - одна итерация&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;N * M + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Noite|Зинченко Д.А.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
В задачах оптимизации EM-алгоритмом называют итеративную процедуру поиска численного значения экстремума какой-либо функции. В частности, в статистике этот алгоритм используется для оценки максимального правдоподобия. Впервые название EM-алгоритм было предложено в 1977 году&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;, однако его идеи были описаны и раньше&amp;lt;ref name=korolev&amp;gt;В.Ю.Королёв. ЕМ-алгоритм, его модификации и их применение к задаче разделения смесей вероятностных распределений.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм применяется для решения задач двух типов &amp;lt;ref name=korolev/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Анализ неполных данных (данных с пропусками). &lt;br /&gt;
# Оценка максимального правдоподобия в случае, если функцию правдоподобия трудно исследовать аналитически. В этом случае введение набора скрытых переменных может существенно упростить задачу.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к задачам второго типа. В данной статье рассматривается следующая постановка задачи кластеризации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;Дано множество из N объектов, каждый из которых представляет собой точку в M-мерном метрическом пространстве. Каждому измерению пространства соответствует некоторое свойство объекта. Необходимо разбить это множество на K подмножеств (кластеров) так, чтобы, чтобы элементы каждого подмножества существенно отличались по свойствам от элементов других подмножеств.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование алгоритма EM подразумевает следующее &#039;&#039;предположение об объектах&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Пусть объекты, которые необходимо разбить на кластеры, появляются случайным образом и независимо друг от друга согласно вероятностному распределению, равному смеси (линейной комбинации) распределений кластеров. В данной статье в дальнейшем будет считаться, что распределение каждого кластера является многомерным нормальным распределением с произвольной матрицей ковариации - наиболее часто используемое предположение.&lt;br /&gt;
&lt;br /&gt;
Тогда каждый объект принадлежит каждому кластеру, но с разной вероятностью. EM-алгоритм итеративно оценивает параметры распределений кластеров, максимизируя логарифмическую функцию максимального правдоподобия. После окончания работы алгоритма объект будет отнесен к кластеру, вероятность принадлежности которому максимальна. Вводимый набор скрытых переменных для каждого объекта - вероятности того, что объект принадлежит каждому из кластеров.&lt;br /&gt;
&lt;br /&gt;
Итерация алгоритма состоит из двух последовательных шагов.&lt;br /&gt;
&lt;br /&gt;
# (Expectation) Вычисляются новые ожидаемые значения скрытых переменных.&lt;br /&gt;
# (Maximization) Решается задача максимизации правдоподобия: По текущим значениям скрытых переменных обновляются параметры распределений для кластеров: математическое ожидание, дисперсия и вероятность появления объектов из кластера.&lt;br /&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;N&amp;lt;/math&amp;gt; - количество объектов, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - количество параметров объекта&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\gamma_{n,k}&amp;lt;/math&amp;gt; - значения скрытых переменных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N_{k}&amp;lt;/math&amp;gt; - количество элементов отнесенных к соответствующему кластеру&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{1},...,x_n&amp;lt;/math&amp;gt; - объекты&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Параметры распределений:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{1},...,w_{k}&amp;lt;/math&amp;gt; - вероятности появления объектов из кластеров (веса кластеров), &amp;lt;math&amp;gt;\sum_{k=1}^Kw_{k}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{1},...,\mu_{k}&amp;lt;/math&amp;gt; - центры гауссиан кластеров&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma_{1},...,\Sigma_{k}&amp;lt;/math&amp;gt; - матрицы ковариации гауссиан кластеров, каждая матрица имеет размерность &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Смесь распределений:&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; P(x) = \sum_{j=1}^Kw_jp(x|\mu_{j}, \Sigma_{j})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Цель алгоритма - вычислить параметры распределений, максимизирующих логарифм функции правдоподобия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\ln P(x|w,\mu,\Sigma)= \sum_{n=1}^N \ln \{ \sum_{k=1}^K w_{k}p(x_{n}|\mu_{k},\Sigma_{k})\}&amp;lt;/math&amp;gt;.&amp;lt;/center&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
* В начале работы алгоритма задаются параметры начального приближения:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{i} = 1/K, \mu_{i} = random(x_{j}), i=1..K, j=1..N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{j,j}^{k}=\frac{1}{NK}\sum_{i=1}^N(x_{i,j} - \mu_{k,j})^2, k=1..K, j=1..M&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Поскольку от начального приближения может сильно зависеть результат работы алгоритма, вместо инициализации кластеров случайными центрами, равными весами и диагональными матрицами ковариации, как в приведенных формулах, часто применяют другие способы (подробнее - в [[#Особенности реализации последовательного алгоритма | особенностях реализации]])&#039;&#039;&lt;br /&gt;
* Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
** E-шаг: используя текущее значение параметров &amp;lt;math&amp;gt;w_{1},...,w_{k};\mu_{1},...,\mu_{k};\Sigma^{1},...,\Sigma^{k}&amp;lt;/math&amp;gt;, вычисляем значение вектора скрытых переменных &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\gamma_{n,k}=\frac{w_{k}p(x_{n}|\mu_{k},\Sigma^{k})}{\sum_{j=1}^K w_{j}p(x_{n}|\mu_{j},\Sigma^{j})}, &amp;lt;/math&amp;gt; знаменатель дроби - нормировочный коэффициент&amp;lt;/center&amp;gt;&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p(x|\mu,\Sigma)=\frac{1}{{(2\pi)}^{\frac{N}{2}}\sqrt{|\Sigma|}}exp\biggl\{-\frac{1}{2}{(x-\mu)}^T{\Sigma}^{-1}(x-\mu)\biggr\}&amp;lt;/math&amp;gt; - плотность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерного нормального распределения&amp;lt;/center&amp;gt;&lt;br /&gt;
** М-шаг: переоценка параметров по текущим значениям скрытых переменных для &amp;lt;math&amp;gt;k = 1..K&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\mu^{new}_{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k}x_{n}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{new}^{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k} (x_{n}-\mu_{k}^{new})(x_{n}-\mu_{k}^{new})^{T}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{k}^{new}=\frac{N_{k}}{N}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;N_{k}=\sum_{n=1}^N \gamma_{n,k}&amp;lt;/math&amp;gt;.&amp;lt;/center&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;
Вычислительное ядро алгоритма состоит из двух шагов, повторяющихся каждую итерацию:&lt;br /&gt;
*Обновление скрытых переменных на основе текущих параметров распределений&lt;br /&gt;
*Обновление параметров кластеров: весов, центров и матриц ковариации&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании вычислительного ядра алгоритма]], основную часть алгоритма составляют итеративно проводимые макрооперации: Expectation шаг - вычисление новых значений скрытых переменных, Maximization шаг - обновление параметров кластеров. Макроструктура алгоритма представлена на рисунке 1:&lt;br /&gt;
[[file:EM_macro.png|thumb|center|600px|Рисунок 1: Макроструктура EM-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Примерная схема реализации EM алгоритма с предварительной обработкой матриц ковариации:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
// n - количество объектов&lt;br /&gt;
&lt;br /&gt;
// m - количество координат объектов&lt;br /&gt;
&lt;br /&gt;
// k - количество кластеров&lt;br /&gt;
&lt;br /&gt;
Инициализировать веса и центры кластеров;&lt;br /&gt;
Инициализировать матрицы ковариации;&lt;br /&gt;
&lt;br /&gt;
// Основной цикл&lt;br /&gt;
Пока условие остановки не выполнено&lt;br /&gt;
    // E-шаг&lt;br /&gt;
    В цикле для каждого кластера&lt;br /&gt;
        Вычислить определитель матрицы ковариации Sigma;&lt;br /&gt;
        Вычислить обратную матрицу матрице Sigma;&lt;br /&gt;
    В цикле для каждого объекта&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Вычислить и запомнить p(x | mu, Sigma) для текущего объекта и кластера;&lt;br /&gt;
        Просуммировать вычисленные p(x | mu, Sigma);&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Обновить скрытые переменные gamma;&lt;br /&gt;
    // M-шаг&lt;br /&gt;
    Обновить веса w;&lt;br /&gt;
    Обновить центры кластеров mu;&lt;br /&gt;
    Обновить матрицы ковариации Sigma;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления определителя произвольной матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления матрицы, обратной произвольной матрице ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации - &amp;lt;math&amp;gt;O(K * M^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С учетом заранее вычисленных определителей и обратных матриц сложность вычисления &amp;lt;math&amp;gt;p(x | \mu,\Sigma)&amp;lt;/math&amp;gt; составит: &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага E составит &amp;lt;math&amp;gt;O(N * M^2 * K + K * M^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления весов кластеров &amp;lt;math&amp;gt;O(K * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления центров кластеров &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления одной матрицы ковариации &amp;lt;math&amp;gt;O(N * M)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления всех матриц ковариации &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага M алгоритма - &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит &amp;lt;math&amp;gt;O(K * M^2 * N + K * M^3 + K * M * N)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В предположении, что размерность объектов много меньше их количества &amp;lt;math&amp;gt;M &amp;lt;&amp;lt; N&amp;lt;/math&amp;gt; получим сложность итерации &amp;lt;math&amp;gt;O(K * M^2 * N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большу́ю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее - вынесены за основной цикл шага E&amp;lt;ref name=ParallelEMComparissonGraphLab&amp;gt;Henggang Cui, Jinliang Wei, Wei Dai. Parallel Implementation of Expectation-Maximization for Fast Convergence - School of Computer Science, Carnegie Mellon University. [https://users.ece.cmu.edu/~hengganc/archive/report/final.pdf]&amp;lt;/ref&amp;gt;. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм&amp;lt;ref&amp;gt;Вячеслав Орешков. EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а суммарная сложность шага E и сложность всей итерации составит &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Макроструктура алгоритма представлена на рисунке 1 (см. [[#Макроструктура алгоритма|раздел 1.4]] статьи).&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 представлена схема вычислений E-шага алгоритма для одного объекта: для объекта &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и параметров &amp;lt;math&amp;gt;w_{j}, \mu_{j}, \Sigma_{j}, j=1..k&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются ненормированные значения скрытых переменных &amp;lt;math&amp;gt;g_{j}&amp;lt;/math&amp;gt;, нормировочный коэффициент &#039;&#039;normСoeff&#039;&#039;, и получаются итоговые значения &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step.png|thumb|center|400px|Рисунок 2: E-шаг EM алгоритма для одного объекта]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 представлена схема вычислений E-шага алгоритма для всех объектов: для объекта &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt; и параметров-векторов &amp;lt;math&amp;gt;w, \mu, \Sigma&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются значения скрытых переменных. &amp;lt;math&amp;gt;E_{i}, i=1..n&amp;lt;/math&amp;gt; - маркооперации, E-шаги для соответствующих объектов.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step_all.png|thumb|center|400px|Рисунок 3: E-шаг EM алгоритма для всех объектов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена схема вычислений M-шага алгоритма для одного кластера: для объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и скрытых переменных &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;, соответствующих степени принадлежности этих объектов кластеру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, согласно формулам шага M [[#Математическое описание алгоритма|раздела 1.2]] вычисляется нормировочный коэффициент &amp;lt;math&amp;gt;N_{j}&amp;lt;/math&amp;gt; и параметры этого кластера: вес &amp;lt;math&amp;gt;w_{j}^{new}&amp;lt;/math&amp;gt;, матрица ковариации &amp;lt;math&amp;gt;\Sigma_{j}^{new}&amp;lt;/math&amp;gt; и центр кластера &amp;lt;math&amp;gt;\mu_{j}^{new}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step.png|thumb|center|400px|Рисунок 4: M-шаг EM алгоритма для одного кластера]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена схема вычислений M-шага алгоритма для всех кластеров. &amp;lt;math&amp;gt;M_{j}, j=1..k&amp;lt;/math&amp;gt; соответствует макрооперации - M-шагу для соответствующего кластера и скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step_all.png|thumb|center|400px|Рисунок 5: M-шаг EM алгоритма для всех кластеров]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Из схем вычислений шагов E и M шагов алгоритма, приведенным в [[#Информационный граф|предыдущем разделе]], видно, что если размерность матрицы ковариации небольшая (тогда вычисление определителя и обратной матрицы матрице ковариации не является трудоемкой операцией), обе макрооперации EM алгоритма можно распараллеливать как по кластерам, так и по объектам.&lt;br /&gt;
&lt;br /&gt;
Как правило количество кластеров, на которые нужно разбить объекты, несравнимо меньше количества объектов, поэтому распараллеливание в большинстве существующих реализаций происходит по объектам: обработка объектов по возможности равномерно распределяются по кластерам. Теоретически (если считать передачу данных между процессорами мгновенной) при наличии неограниченного числа процессоров сложность алгоритма составит &amp;lt;math&amp;gt;O(m^2 * k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* Целое неотрицательное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
* Значения координат объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; объектов с &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; координатами каждый.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;n * m&amp;lt;/math&amp;gt; вещественных чисел (если координаты объектов - вещественные числа), &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целое неотрицательное число.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - для каждого объекта указан номер кластера, к которому он отнесен.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; целых неотрицательных чисел. &lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
=== Преимущества и недостатки ===&lt;br /&gt;
EM-алгоритм обладает следующими преимуществами и недостатками&amp;lt;ref&amp;gt;EM алгоритм, его модификации и обобщения. machinelearning.ru [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]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Преимущества:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Слабо чувствителен к выбросам&lt;br /&gt;
# Прост в реализации&lt;br /&gt;
# Быстро сходится при удачном выборе начальных значений параметров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Неустойчив к выбору начальных значений параметров - от них зависит как скорость сходимости, так и результат работы: алгоритм может сойтись к локальному экстремуму функции правдоподобия, который может быть существенно ниже глобального.&lt;br /&gt;
# Алгоритм не находит оптимальное количество кластеров. Количество кластеров, на которые нужно разбить множество объектов, является параметром алгоритма.&lt;br /&gt;
# При большой размерности пространства объектов выдвинутое предположение о модели их распределения может быть некорректным.&lt;br /&gt;
&lt;br /&gt;
=== Влияние структуры матрицы ковариации на форму кластера ===&lt;br /&gt;
&lt;br /&gt;
[[file:DifferentCovariance.png|thumb|center|800px|Рисунок 6: Влияние структуры матрицы ковариации на форму кластеров для двумерного случая. a) - матрицы ковариации являются диагональными, b) - матрицы ковариации произвольны. &amp;lt;ref&amp;gt;Mathworks: Clustering Using Gaussian Mixture Models [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 6 наглядно показывает, что при диагональной форме матриц ковариации полуоси эллипса (в общем случае - эллипсоида), соответствующего распределению объектов, отнесенных кластеру, параллельны осям координат объектов. В противном случае полуоси могут располагаться произвольным образом.&lt;br /&gt;
&lt;br /&gt;
=== Общие свойства ===&lt;br /&gt;
[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] EM алгоритма равна &amp;lt;math&amp;gt;m * k * it&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - размерность объекта, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров, а &amp;lt;math&amp;gt;it&amp;lt;/math&amp;gt; - количество итераций. &lt;br /&gt;
&lt;br /&gt;
EM-алгоритм является итерационным, и число итераций в общем случае не фиксировано: оно зависит от условий остановки, начальных приближений и расположения объектов. Поэтому этот алгоритм &#039;&#039;недетерминированный&#039;&#039;. По тем же причинам EM-алгоритм является &#039;&#039;неустойчивым&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
=== Инициализация параметров распределений ===&lt;br /&gt;
Наиболее распространены 3 способа инициализации центров распределений для EM алгоритма:&lt;br /&gt;
# центр распределения совпадает со случайно выбранным объектом &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
# все наблюдения распределяются по кластерам случайным образом, а затем для каждого кластера пересчитывается цент соответствующего распределения&lt;br /&gt;
# центры кластеров получаются в результате работы алгоритма k-means. Использование такой инициализации оправдано тем, что k-means требует меньших вычислительных затрат и быстрее сходится&amp;lt;ref&amp;gt;EM алгоритм (пример) machinelearning.ru [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])&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Многие статьи&amp;lt;ref name=FREERIDE&amp;gt;Leonid Glimcher, Gagan Agrawal. Parallelising EM Algorithm on a Cluster of SMPs [http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CV&amp;gt;López-de-Teruel P. E., García J. M., Acacio; The Parallel EM Algorithm and its Applications in Computer Vision [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=MULTITHREAD&amp;gt;Sharon X. Lee, Kaleb L. Leemaqz, Geoffrey J. McLachlan. A simple multithreaded implementation of the EM algorithm for mixture models [https://arxiv.org/pdf/1606.02054.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CUDA&amp;gt;Araújo, G.F., H.T. Macedo, M.T. Chella, C.A.E. Montesco and M.V.O. Medeiros. PARALLEL IMPLEMENTATION OF EXPECTATION-MAXIMISATION ALGORITHM FOR THE TRAINING OF GAUSSIAN MIXTURE MODELS [https://ri.ufs.br/bitstream/123456789/1764/1/ExpectationMaximisationAlgorithm.pdf]&amp;lt;/ref&amp;gt;, в которых представлены параллельные реализации EM алгоритма, описывают помимо использующихся программных и аппаратных решений результаты проведенных экспериментов с данными. В качестве примера в этом разделе будут рассмотрены результаты эксперементов, проведенных со связующим программным обеспечением (&#039;&#039;middleware&#039;&#039;) FREERIDE&amp;lt;ref&amp;gt;Leonid Glimchera, Ruoming Jinb, Gagan Agrawala. Middleware for data mining applications on clusters and grids [http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf]&amp;lt;/ref&amp;gt; (FRamework for Rapid Implementation of Datamining Engines), обеспечивающим возможность распараллеливания как для систем с общей памятью (в частности, симметричных мультипроцессорных систем), так и для систем с распределенной памятью.&lt;br /&gt;
&lt;br /&gt;
Эксперименты проводились на кластере машин Pentium 700MHz связанных при помощи Myrinet&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Myrinet&amp;lt;/ref&amp;gt; LANai 7.0 на трех наборах данных: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;а)&#039;&#039;&#039; 3.3 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; 6.2 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; 12.5 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
Объекты представляют собой координаты точек 10-мерного пространства.&lt;br /&gt;
 &lt;br /&gt;
Количество машин в кластере варьировалось от 1 до 8, при этом на каждой машине запускалось до четырех параллельных потоков.&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов представлены на рисунках 7-9&amp;lt;ref name=FREERIDE/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_a.png|thumb|center|350px|Рисунок 7: набор данных a)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_b.png|thumb|center|357px|Рисунок 8: набор данных b)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_c.png|thumb|center|351px|Рисунок 9: набор данных c)]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что используемые в данном исследовании машины, как и коммуникационная среда, сейчас не используются и считаются устаревшими, результат приведенных экспериментов наглядно показывает, что EM алгоритм хорошо параллелится, зависимость ускорения от числа узлов в кластере с небольшим количеством узлов близка к линейной, а также, что скорость работы алгоритма линейно зависит от числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Данный раздел может быть дополнен&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Примеры библиотек, содержащих последовательную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV(C++)] ([https://github.com/opencv/opencv/blob/master/modules/ml/src/em.cpp github])&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab]&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html Scikit learn (Python)]&lt;br /&gt;
# [http://mlpack.org/index.html MLPack(C++)]&lt;br /&gt;
&lt;br /&gt;
Примеры библиотек, содержащих параллельную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Здесь приводятся как конкретные реализации, так и статьи, описывающие подходы к реализациям распараллеливания EM-алгоритма&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# [https://spark.apache.org/ Apache Spark]&lt;br /&gt;
# [http://accord-framework.net/ Accord.NET Framework (C#)]&lt;br /&gt;
# Статья об использовании FREERIDE middleware для распараллеливания EM алгоритма &amp;lt;ref name=FREERIDE/&amp;gt; &lt;br /&gt;
# [http://andrewharp.com/gmmcuda реализация с использованием CUDA]&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MPI еще одна реализация с использованием CUDA]&lt;br /&gt;
# статья об использовании параллельного EM алгоритма в задачах компьютерного зрения &amp;lt;ref name=CV/&amp;gt;&lt;br /&gt;
# статья о распараллеливании EM алгоритма с использованием CUDA &amp;lt;ref name=CUDA/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Noite</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Noite&amp;diff=16890</id>
		<title>Обсуждение участника:Noite</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Noite&amp;diff=16890"/>
		<updated>2016-11-14T10:27:21Z</updated>

		<summary type="html">&lt;p&gt;Noite: частичные исправления&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Замечания к [[Участник:Noite/EM-алгоритм_кластеризации]] ==&lt;br /&gt;
&lt;br /&gt;
1) лишняя строка &amp;quot;Алгоритм кластеризации, основанный на максимизации ожидания (EM-алгоритм)&amp;quot; перед содержанием --- убрано&lt;br /&gt;
&lt;br /&gt;
2) отсутствует оценка высоты и ширины ЯПФ параллельного алгоритма во врезке в начале статьи --- врезка исправлена&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ниже - замечания второго рецензента&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
3) Во врезке так и не появилась информация по поводу параллельного алгоритма&lt;br /&gt;
&lt;br /&gt;
4) Из содержания нужно убрать ссылку [5] --- ссылка перенесена внутрь раздела&lt;br /&gt;
&lt;br /&gt;
5) В формулировке задачи в п1.1 нет разъяснения параметра m --- формулировка задачи кластеризации изменена&lt;br /&gt;
&lt;br /&gt;
6) В п1.2 парметры m, n, k почему-то превратились в M, N, K --- параметры m,n,k изменены в п1.1 и во врезке на M,N,K соответственно (пока исправлено не полностью, нужно поправить в п1.2 и диаграммах)&lt;br /&gt;
&lt;br /&gt;
7) П 1.5. Как инициализируются скрытые переменные gamma? Выравнивание псевдокода местами нарушено. Слово &amp;quot;большУю&amp;quot; - здесь лучше использовать значок ударения --- слово большУю исправлено&lt;br /&gt;
&lt;br /&gt;
8) П 1.7 Информационный граф: на рисунке омега превратилась в w, гамма - в Y. --- в используемом редакторе изображений для гаммы использовался следующий символ: γ. То, что он похож на Y - визуальное совпадение. &lt;br /&gt;
&lt;br /&gt;
9)П 1.9 Выходные данные - сказано о векторе n. Поясните, какое значение он имеет в терминах алгоритма кластеризации.&lt;/div&gt;</summary>
		<author><name>Noite</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:Noite/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=16883</id>
		<title>Участник:Noite/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:Noite/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=16883"/>
		<updated>2016-11-14T10:18:33Z</updated>

		<summary type="html">&lt;p&gt;Noite: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(N * M^2 * K)&amp;lt;/math&amp;gt; - одна итерация&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;N * M + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Noite|Зинченко Д.А.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
В задачах оптимизации EM-алгоритмом называют итеративную процедуру поиска численного значения экстремума какой-либо функции. В частности, в статистике этот алгоритм используется для оценки максимального правдоподобия. Впервые название EM-алгоритм было предложено в 1977 году&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;, однако его идеи были описаны и раньше&amp;lt;ref name=korolev&amp;gt;В.Ю.Королёв. ЕМ-алгоритм, его модификации и их применение к задаче разделения смесей вероятностных распределений.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм применяется для решения задач двух типов &amp;lt;ref name=korolev/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Анализ неполных данных (данных с пропусками). &lt;br /&gt;
# Оценка максимального правдоподобия в случае, если функцию правдоподобия трудно исследовать аналитически. В этом случае введение набора скрытых переменных может существенно упростить задачу.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к задачам второго типа. В данной статье рассматривается следующая постановка задачи кластеризации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;Дано множество из N объектов, каждый из которых представляет собой точку в M-мерном метрическом пространстве. Каждому измерению пространства соответствует некоторое свойство объекта. Необходимо разбить это множество на K подмножеств (кластеров) так, чтобы, чтобы элементы каждого подмножества существенно отличались по свойствам от элементов других подмножеств.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование алгоритма EM подразумевает следующее &#039;&#039;предположение об объектах&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Пусть объекты, которые необходимо разбить на кластеры, появляются случайным образом и независимо друг от друга согласно вероятностному распределению, равному смеси (линейной комбинации) распределений кластеров. В данной статье в дальнейшем будет считаться, что распределение каждого кластера является многомерным нормальным распределением с произвольной матрицей ковариации - наиболее часто используемое предположение.&lt;br /&gt;
&lt;br /&gt;
Тогда каждый объект принадлежит каждому кластеру, но с разной вероятностью. EM-алгоритм итеративно оценивает параметры распределений кластеров, максимизируя логарифмическую функцию максимального правдоподобия. После окончания работы алгоритма объект будет отнесен к кластеру, вероятность принадлежности которому максимальна. Вводимый набор скрытых переменных для каждого объекта - вероятности того, что объект принадлежит каждому из кластеров.&lt;br /&gt;
&lt;br /&gt;
Итерация алгоритма состоит из двух последовательных шагов.&lt;br /&gt;
&lt;br /&gt;
# (Expectation) Вычисляются новые ожидаемые значения скрытых переменных.&lt;br /&gt;
# (Maximization) Решается задача максимизации правдоподобия: По текущим значениям скрытых переменных обновляются параметры распределений для кластеров: математическое ожидание, дисперсия и вероятность появления объектов из кластера.&lt;br /&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;N&amp;lt;/math&amp;gt; - количество объектов, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - количество параметров объекта&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\gamma_{n,k}&amp;lt;/math&amp;gt; - значения скрытых переменных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N_{k}&amp;lt;/math&amp;gt; - количество элементов отнесенных к соответствующему кластеру&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{1},...,x_n&amp;lt;/math&amp;gt; - объекты&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Параметры распределений:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{1},...,w_{k}&amp;lt;/math&amp;gt; - вероятности появления объектов из кластеров (веса кластеров), &amp;lt;math&amp;gt;\sum_{k=1}^Kw_{k}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{1},...,\mu_{k}&amp;lt;/math&amp;gt; - центры гауссиан кластеров&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma_{1},...,\Sigma_{k}&amp;lt;/math&amp;gt; - матрицы ковариации гауссиан кластеров, каждая матрица имеет размерность &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Смесь распределений:&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; P(x) = \sum_{j=1}^Kw_jp(x|\mu_{j}, \Sigma_{j})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Цель алгоритма - вычислить параметры распределений, максимизирующих логарифм функции правдоподобия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\ln P(x|w,\mu,\Sigma)= \sum_{n=1}^N \ln \{ \sum_{k=1}^K w_{k}p(x_{n}|\mu_{k},\Sigma_{k})\}&amp;lt;/math&amp;gt;.&amp;lt;/center&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
* В начале работы алгоритма задаются параметры начального приближения:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{i} = 1/K, \mu_{i} = random(x_{j}), i=1..K, j=1..N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{j,j}^{k}=\frac{1}{NK}\sum_{i=1}^N(x_{i,j} - \mu_{k,j})^2, k=1..K, j=1..M&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Поскольку от начального приближения может сильно зависеть результат работы алгоритма, вместо инициализации кластеров случайными центрами, равными весами и диагональными матрицами ковариации, как в приведенных формулах, часто применяют другие способы (подробнее - в [[#Особенности реализации последовательного алгоритма | особенностях реализации]])&#039;&#039;&lt;br /&gt;
* Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
** E-шаг: используя текущее значение параметров &amp;lt;math&amp;gt;w_{1},...,w_{k};\mu_{1},...,\mu_{k};\Sigma^{1},...,\Sigma^{k}&amp;lt;/math&amp;gt;, вычисляем значение вектора скрытых переменных &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\gamma_{n,k}=\frac{w_{k}p(x_{n}|\mu_{k},\Sigma^{k})}{\sum_{j=1}^K w_{j}p(x_{n}|\mu_{j},\Sigma^{j})}, &amp;lt;/math&amp;gt; знаменатель дроби - нормировочный коэффициент&amp;lt;/center&amp;gt;&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p(x|\mu,\Sigma)=\frac{1}{{(2\pi)}^{\frac{N}{2}}\sqrt{|\Sigma|}}exp\biggl\{-\frac{1}{2}{(x-\mu)}^T{\Sigma}^{-1}(x-\mu)\biggr\}&amp;lt;/math&amp;gt; - плотность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерного нормального распределения&amp;lt;/center&amp;gt;&lt;br /&gt;
** М-шаг: переоценка параметров по текущим значениям скрытых переменных для &amp;lt;math&amp;gt;k = 1..K&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\mu^{new}_{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k}x_{n}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{new}^{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k} (x_{n}-\mu_{k}^{new})(x_{n}-\mu_{k}^{new})^{T}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{k}^{new}=\frac{N_{k}}{N}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;N_{k}=\sum_{n=1}^N \gamma_{n,k}&amp;lt;/math&amp;gt;.&amp;lt;/center&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;
Вычислительное ядро алгоритма состоит из двух шагов, повторяющихся каждую итерацию:&lt;br /&gt;
*Обновление скрытых переменных на основе текущих параметров распределений&lt;br /&gt;
*Обновление параметров кластеров: весов, центров и матриц ковариации&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании вычислительного ядра алгоритма]], основную часть алгоритма составляют итеративно проводимые макрооперации: Expectation шаг - вычисление новых значений скрытых переменных, Maximization шаг - обновление параметров кластеров. Макроструктура алгоритма представлена на рисунке 1:&lt;br /&gt;
[[file:EM_macro.png|thumb|center|600px|Рисунок 1: Макроструктура EM-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Примерная схема реализации EM алгоритма с предварительной обработкой матриц ковариации:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
// n - количество объектов&lt;br /&gt;
&lt;br /&gt;
// m - количество координат объектов&lt;br /&gt;
&lt;br /&gt;
// k - количество кластеров&lt;br /&gt;
&lt;br /&gt;
Инициализировать веса и центры кластеров;&lt;br /&gt;
Инициализировать матрицы ковариации;&lt;br /&gt;
&lt;br /&gt;
// Основной цикл&lt;br /&gt;
Пока условие остановки не выполнено&lt;br /&gt;
    // E-шаг&lt;br /&gt;
    В цикле для каждого кластера&lt;br /&gt;
        Вычислить определитель матрицы ковариации Sigma;&lt;br /&gt;
        Вычислить обратную матрицу матрице Sigma;&lt;br /&gt;
    В цикле для каждого объекта&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Вычислить и запомнить p(x | mu, Sigma) для текущего объекта и кластера;&lt;br /&gt;
            Просуммировать вычисленные p(x | mu, Sigma);&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Обновить скрытые переменные gamma;&lt;br /&gt;
    // M-шаг&lt;br /&gt;
    Обновить веса w;&lt;br /&gt;
    Обновить центры кластеров mu;&lt;br /&gt;
    Обновить матрицы ковариации Sigma;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления определителя произвольной матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления матрицы, обратной произвольной матрице ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации - &amp;lt;math&amp;gt;O(K * M^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С учетом заранее вычисленных определителей и обратных матриц сложность вычисления &amp;lt;math&amp;gt;p(x | \mu,\Sigma)&amp;lt;/math&amp;gt; составит: &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага E составит &amp;lt;math&amp;gt;O(N * M^2 * K + K * M^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления весов кластеров &amp;lt;math&amp;gt;O(K * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления центров кластеров &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления одной матрицы ковариации &amp;lt;math&amp;gt;O(N * M)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления всех матриц ковариации &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага M алгоритма - &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит &amp;lt;math&amp;gt;O(K * M^2 * N + K * M^3 + K * M * N)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В предположении, что размерность объектов много меньше их количества &amp;lt;math&amp;gt;M &amp;lt;&amp;lt; N&amp;lt;/math&amp;gt; получим сложность итерации &amp;lt;math&amp;gt;O(K * M^2 * N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большу́ю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее - вынесены за основной цикл шага E&amp;lt;ref name=ParallelEMComparissonGraphLab&amp;gt;Henggang Cui, Jinliang Wei, Wei Dai. Parallel Implementation of Expectation-Maximization for Fast Convergence - School of Computer Science, Carnegie Mellon University. [https://users.ece.cmu.edu/~hengganc/archive/report/final.pdf]&amp;lt;/ref&amp;gt;. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм&amp;lt;ref&amp;gt;Вячеслав Орешков. EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а суммарная сложность шага E и сложность всей итерации составит &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Макроструктура алгоритма представлена на рисунке 1 (см. [[#Макроструктура алгоритма|раздел 1.4]] статьи).&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 представлена схема вычислений E-шага алгоритма для одного объекта: для объекта &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и параметров &amp;lt;math&amp;gt;w_{j}, \mu_{j}, \Sigma_{j}, j=1..k&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются ненормированные значения скрытых переменных &amp;lt;math&amp;gt;g_{j}&amp;lt;/math&amp;gt;, нормировочный коэффициент &#039;&#039;normСoeff&#039;&#039;, и получаются итоговые значения &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step.png|thumb|center|400px|Рисунок 2: E-шаг EM алгоритма для одного объекта]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 представлена схема вычислений E-шага алгоритма для всех объектов: для объекта &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt; и параметров-векторов &amp;lt;math&amp;gt;w, \mu, \Sigma&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются значения скрытых переменных. &amp;lt;math&amp;gt;E_{i}, i=1..n&amp;lt;/math&amp;gt; - маркооперации, E-шаги для соответствующих объектов.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step_all.png|thumb|center|400px|Рисунок 3: E-шаг EM алгоритма для всех объектов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена схема вычислений M-шага алгоритма для одного кластера: для объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и скрытых переменных &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;, соответствующих степени принадлежности этих объектов кластеру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, согласно формулам шага M [[#Математическое описание алгоритма|раздела 1.2]] вычисляется нормировочный коэффициент &amp;lt;math&amp;gt;N_{j}&amp;lt;/math&amp;gt; и параметры этого кластера: вес &amp;lt;math&amp;gt;w_{j}^{new}&amp;lt;/math&amp;gt;, матрица ковариации &amp;lt;math&amp;gt;\Sigma_{j}^{new}&amp;lt;/math&amp;gt; и центр кластера &amp;lt;math&amp;gt;\mu_{j}^{new}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step.png|thumb|center|400px|Рисунок 4: M-шаг EM алгоритма для одного кластера]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена схема вычислений M-шага алгоритма для всех кластеров. &amp;lt;math&amp;gt;M_{j}, j=1..k&amp;lt;/math&amp;gt; соответствует макрооперации - M-шагу для соответствующего кластера и скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step_all.png|thumb|center|400px|Рисунок 5: M-шаг EM алгоритма для всех кластеров]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Из схем вычислений шагов E и M шагов алгоритма, приведенным в [[#Информационный граф|предыдущем разделе]], видно, что если размерность матрицы ковариации небольшая (тогда вычисление определителя и обратной матрицы матрице ковариации не является трудоемкой операцией), обе макрооперации EM алгоритма можно распараллеливать как по кластерам, так и по объектам.&lt;br /&gt;
&lt;br /&gt;
Как правило количество кластеров, на которые нужно разбить объекты, несравнимо меньше количества объектов, поэтому распараллеливание в большинстве существующих реализаций происходит по объектам: обработка объектов по возможности равномерно распределяются по кластерам. Теоретически (если считать передачу данных между процессорами мгновенной) при наличии неограниченного числа процессоров сложность алгоритма составит &amp;lt;math&amp;gt;O(m^2 * k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* Целое неотрицательное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
* Значения координат объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; объектов с &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; координатами каждый.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;n * m&amp;lt;/math&amp;gt; вещественных чисел (если координаты объектов - вещественные числа), &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целое неотрицательное число.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - для каждого объекта указан номер кластера, к которому он отнесен.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; целых неотрицательных чисел. &lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
=== Преимущества и недостатки ===&lt;br /&gt;
EM-алгоритм обладает следующими преимуществами и недостатками&amp;lt;ref&amp;gt;EM алгоритм, его модификации и обобщения. machinelearning.ru [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]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Преимущества:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Слабо чувствителен к выбросам&lt;br /&gt;
# Прост в реализации&lt;br /&gt;
# Быстро сходится при удачном выборе начальных значений параметров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Неустойчив к выбору начальных значений параметров - от них зависит как скорость сходимости, так и результат работы: алгоритм может сойтись к локальному экстремуму функции правдоподобия, который может быть существенно ниже глобального.&lt;br /&gt;
# Алгоритм не находит оптимальное количество кластеров. Количество кластеров, на которые нужно разбить множество объектов, является параметром алгоритма.&lt;br /&gt;
# При большой размерности пространства объектов выдвинутое предположение о модели их распределения может быть некорректным.&lt;br /&gt;
&lt;br /&gt;
=== Влияние структуры матрицы ковариации на форму кластера ===&lt;br /&gt;
&lt;br /&gt;
[[file:DifferentCovariance.png|thumb|center|800px|Рисунок 6: Влияние структуры матрицы ковариации на форму кластеров для двумерного случая. a) - матрицы ковариации являются диагональными, b) - матрицы ковариации произвольны. &amp;lt;ref&amp;gt;Mathworks: Clustering Using Gaussian Mixture Models [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 6 наглядно показывает, что при диагональной форме матриц ковариации полуоси эллипса (в общем случае - эллипсоида), соответствующего распределению объектов, отнесенных кластеру, параллельны осям координат объектов. В противном случае полуоси могут располагаться произвольным образом.&lt;br /&gt;
&lt;br /&gt;
=== Общие свойства ===&lt;br /&gt;
[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] EM алгоритма равна &amp;lt;math&amp;gt;m * k * it&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - размерность объекта, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров, а &amp;lt;math&amp;gt;it&amp;lt;/math&amp;gt; - количество итераций. &lt;br /&gt;
&lt;br /&gt;
EM-алгоритм является итерационным, и число итераций в общем случае не фиксировано: оно зависит от условий остановки, начальных приближений и расположения объектов. Поэтому этот алгоритм &#039;&#039;недетерминированный&#039;&#039;. По тем же причинам EM-алгоритм является &#039;&#039;неустойчивым&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
=== Инициализация параметров распределений ===&lt;br /&gt;
Наиболее распространены 3 способа инициализации центров распределений для EM алгоритма:&lt;br /&gt;
# центр распределения совпадает со случайно выбранным объектом &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
# все наблюдения распределяются по кластерам случайным образом, а затем для каждого кластера пересчитывается цент соответствующего распределения&lt;br /&gt;
# центры кластеров получаются в результате работы алгоритма k-means. Использование такой инициализации оправдано тем, что k-means требует меньших вычислительных затрат и быстрее сходится&amp;lt;ref&amp;gt;EM алгоритм (пример) machinelearning.ru [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])&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Многие статьи&amp;lt;ref name=FREERIDE&amp;gt;Leonid Glimcher, Gagan Agrawal. Parallelising EM Algorithm on a Cluster of SMPs [http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CV&amp;gt;López-de-Teruel P. E., García J. M., Acacio; The Parallel EM Algorithm and its Applications in Computer Vision [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=MULTITHREAD&amp;gt;Sharon X. Lee, Kaleb L. Leemaqz, Geoffrey J. McLachlan. A simple multithreaded implementation of the EM algorithm for mixture models [https://arxiv.org/pdf/1606.02054.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CUDA&amp;gt;Araújo, G.F., H.T. Macedo, M.T. Chella, C.A.E. Montesco and M.V.O. Medeiros. PARALLEL IMPLEMENTATION OF EXPECTATION-MAXIMISATION ALGORITHM FOR THE TRAINING OF GAUSSIAN MIXTURE MODELS [https://ri.ufs.br/bitstream/123456789/1764/1/ExpectationMaximisationAlgorithm.pdf]&amp;lt;/ref&amp;gt;, в которых представлены параллельные реализации EM алгоритма, описывают помимо использующихся программных и аппаратных решений результаты проведенных экспериментов с данными. В качестве примера в этом разделе будут рассмотрены результаты эксперементов, проведенных со связующим программным обеспечением (&#039;&#039;middleware&#039;&#039;) FREERIDE&amp;lt;ref&amp;gt;Leonid Glimchera, Ruoming Jinb, Gagan Agrawala. Middleware for data mining applications on clusters and grids [http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf]&amp;lt;/ref&amp;gt; (FRamework for Rapid Implementation of Datamining Engines), обеспечивающим возможность распараллеливания как для систем с общей памятью (в частности, симметричных мультипроцессорных систем), так и для систем с распределенной памятью.&lt;br /&gt;
&lt;br /&gt;
Эксперименты проводились на кластере машин Pentium 700MHz связанных при помощи Myrinet&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Myrinet&amp;lt;/ref&amp;gt; LANai 7.0 на трех наборах данных: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;а)&#039;&#039;&#039; 3.3 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; 6.2 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; 12.5 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
Объекты представляют собой координаты точек 10-мерного пространства.&lt;br /&gt;
 &lt;br /&gt;
Количество машин в кластере варьировалось от 1 до 8, при этом на каждой машине запускалось до четырех параллельных потоков.&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов представлены на рисунках 7-9&amp;lt;ref name=FREERIDE/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_a.png|thumb|center|350px|Рисунок 7: набор данных a)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_b.png|thumb|center|357px|Рисунок 8: набор данных b)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_c.png|thumb|center|351px|Рисунок 9: набор данных c)]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что используемые в данном исследовании машины, как и коммуникационная среда, сейчас не используются и считаются устаревшими, результат приведенных экспериментов наглядно показывает, что EM алгоритм хорошо параллелится, зависимость ускорения от числа узлов в кластере с небольшим количеством узлов близка к линейной, а также, что скорость работы алгоритма линейно зависит от числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Данный раздел может быть дополнен&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Примеры библиотек, содержащих последовательную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV(C++)] ([https://github.com/opencv/opencv/blob/master/modules/ml/src/em.cpp github])&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab]&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html Scikit learn (Python)]&lt;br /&gt;
# [http://mlpack.org/index.html MLPack(C++)]&lt;br /&gt;
&lt;br /&gt;
Примеры библиотек, содержащих параллельную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Здесь приводятся как конкретные реализации, так и статьи, описывающие подходы к реализациям распараллеливания EM-алгоритма&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# [https://spark.apache.org/ Apache Spark]&lt;br /&gt;
# [http://accord-framework.net/ Accord.NET Framework (C#)]&lt;br /&gt;
# Статья об использовании FREERIDE middleware для распараллеливания EM алгоритма &amp;lt;ref name=FREERIDE/&amp;gt; &lt;br /&gt;
# [http://andrewharp.com/gmmcuda реализация с использованием CUDA]&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MPI еще одна реализация с использованием CUDA]&lt;br /&gt;
# статья об использовании параллельного EM алгоритма в задачах компьютерного зрения &amp;lt;ref name=CV/&amp;gt;&lt;br /&gt;
# статья о распараллеливании EM алгоритма с использованием CUDA &amp;lt;ref name=CUDA/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Noite</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:Noite/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=16882</id>
		<title>Участник:Noite/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:Noite/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=16882"/>
		<updated>2016-11-14T10:16:25Z</updated>

		<summary type="html">&lt;p&gt;Noite: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(N * M^2 * K)&amp;lt;/math&amp;gt; - одна итерация&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;N * M + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Noite|Зинченко Д.А.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
В задачах оптимизации EM-алгоритмом называют итеративную процедуру поиска численного значения экстремума какой-либо функции. В частности, в статистике этот алгоритм используется для оценки максимального правдоподобия. Впервые название EM-алгоритм было предложено в 1977 году&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;, однако его идеи были описаны и раньше&amp;lt;ref name=korolev&amp;gt;В.Ю.Королёв. ЕМ-алгоритм, его модификации и их применение к задаче разделения смесей вероятностных распределений.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм применяется для решения задач двух типов &amp;lt;ref name=korolev/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Анализ неполных данных (данных с пропусками). &lt;br /&gt;
# Оценка максимального правдоподобия в случае, если функцию правдоподобия трудно исследовать аналитически. В этом случае введение набора скрытых переменных может существенно упростить задачу.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к задачам второго типа. В данной статье рассматривается следующая постановка задачи кластеризации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;Дано множество из N объектов, каждый из которых представляет собой точку в M-мерном метрическом пространстве. Каждому измерению пространства соответствует некоторое свойство объекта. Необходимо разбить это множество на K подмножеств (кластеров) так, чтобы, чтобы элементы каждого подмножества существенно отличались по свойствам от элементов других подмножеств.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование алгоритма EM подразумевает следующее &#039;&#039;предположение об объектах&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Пусть объекты, которые необходимо разбить на кластеры, появляются случайным образом и независимо друг от друга согласно вероятностному распределению, равному смеси (линейной комбинации) распределений кластеров. В данной статье в дальнейшем будет считаться, что распределение каждого кластера является многомерным нормальным распределением с произвольной матрицей ковариации - наиболее часто используемое предположение.&lt;br /&gt;
&lt;br /&gt;
Тогда каждый объект принадлежит каждому кластеру, но с разной вероятностью. EM-алгоритм итеративно оценивает параметры распределений кластеров, максимизируя логарифмическую функцию максимального правдоподобия. После окончания работы алгоритма объект будет отнесен к кластеру, вероятность принадлежности которому максимальна. Вводимый набор скрытых переменных для каждого объекта - вероятности того, что объект принадлежит каждому из кластеров.&lt;br /&gt;
&lt;br /&gt;
Итерация алгоритма состоит из двух последовательных шагов.&lt;br /&gt;
&lt;br /&gt;
# (Expectation) Вычисляются новые ожидаемые значения скрытых переменных.&lt;br /&gt;
# (Maximization) Решается задача максимизации правдоподобия: По текущим значениям скрытых переменных обновляются параметры распределений для кластеров: математическое ожидание, дисперсия и вероятность появления объектов из кластера.&lt;br /&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;N&amp;lt;/math&amp;gt; - количество объектов, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - количество параметров объекта&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\gamma_{n,k}&amp;lt;/math&amp;gt; - значения скрытых переменных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N_{k}&amp;lt;/math&amp;gt; - количество элементов отнесенных к соответствующему кластеру&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{1},...,x_n&amp;lt;/math&amp;gt; - объекты&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Параметры распределений:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{1},...,w_{k}&amp;lt;/math&amp;gt; - вероятности появления объектов из кластеров (веса кластеров), &amp;lt;math&amp;gt;\sum_{k=1}^Kw_{k}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{1},...,\mu_{k}&amp;lt;/math&amp;gt; - центры гауссиан кластеров&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma_{1},...,\Sigma_{k}&amp;lt;/math&amp;gt; - матрицы ковариации гауссиан кластеров, каждая матрица имеет размерность &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Смесь распределений:&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; P(x) = \sum_{j=1}^Kw_jp(x|\mu_{j}, \Sigma_{j})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Цель алгоритма - вычислить параметры распределений, максимизирующих логарифм функции правдоподобия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\ln P(x|w,\mu,\Sigma)= \sum_{n=1}^N \ln \{ \sum_{k=1}^K w_{k}p(x_{n}|\mu_{k},\Sigma_{k})\}&amp;lt;/math&amp;gt;.&amp;lt;/center&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
* В начале работы алгоритма задаются параметры начального приближения:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{i} = 1/K, \mu_{i} = random(x_{j}), i=1..K, j=1..N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{j,j}^{k}=\frac{1}{NK}\sum_{i=1}^N(x_{i,j} - \mu_{k,j})^2, k=1..K, j=1..M&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Поскольку от начального приближения может сильно зависеть результат работы алгоритма, вместо инициализации кластеров случайными центрами, равными весами и диагональными матрицами ковариации, как в приведенных формулах, часто применяют другие способы (подробнее - в [[#Особенности реализации последовательного алгоритма | особенностях реализации]])&#039;&#039;&lt;br /&gt;
* Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
** E-шаг: используя текущее значение параметров &amp;lt;math&amp;gt;w_{1},...,w_{k};\mu_{1},...,\mu_{k};\Sigma^{1},...,\Sigma^{k}&amp;lt;/math&amp;gt;, вычисляем значение вектора скрытых переменных &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\gamma_{n,k}=\frac{w_{k}p(x_{n}|\mu_{k},\Sigma^{k})}{\sum_{j=1}^K w_{j}p(x_{n}|\mu_{j},\Sigma^{j})}, &amp;lt;/math&amp;gt; знаменатель дроби - нормировочный коэффициент&amp;lt;/center&amp;gt;&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p(x|\mu,\Sigma)=\frac{1}{{(2\pi)}^{\frac{N}{2}}\sqrt{|\Sigma|}}exp\biggl\{-\frac{1}{2}{(x-\mu)}^T{\Sigma}^{-1}(x-\mu)\biggr\}&amp;lt;/math&amp;gt; - плотность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерного нормального распределения&amp;lt;/center&amp;gt;&lt;br /&gt;
** М-шаг: переоценка параметров по текущим значениям скрытых переменных для &amp;lt;math&amp;gt;k = 1..K&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\mu^{new}_{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k}x_{n}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{new}^{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k} (x_{n}-\mu_{k}^{new})(x_{n}-\mu_{k}^{new})^{T}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{k}^{new}=\frac{N_{k}}{N}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;N_{k}=\sum_{n=1}^N \gamma_{n,k}&amp;lt;/math&amp;gt;.&amp;lt;/center&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;
Вычислительное ядро алгоритма состоит из двух шагов, повторяющихся каждую итерацию:&lt;br /&gt;
*Обновление скрытых переменных на основе текущих параметров распределений&lt;br /&gt;
*Обновление параметров кластеров: весов, центров и матриц ковариации&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании вычислительного ядра алгоритма]], основную часть алгоритма составляют итеративно проводимые макрооперации: Expectation шаг - вычисление новых значений скрытых переменных, Maximization шаг - обновление параметров кластеров. Макроструктура алгоритма представлена на рисунке 1:&lt;br /&gt;
[[file:EM_macro.png|thumb|center|600px|Рисунок 1: Макроструктура EM-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Примерная схема реализации EM алгоритма с предварительной обработкой матриц ковариации:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
// n - количество объектов&lt;br /&gt;
&lt;br /&gt;
// m - количество координат объектов&lt;br /&gt;
&lt;br /&gt;
// k - количество кластеров&lt;br /&gt;
&lt;br /&gt;
Инициализировать веса и центры кластеров;&lt;br /&gt;
Инициализировать матрицы ковариации;&lt;br /&gt;
&lt;br /&gt;
// Основной цикл&lt;br /&gt;
Пока условие остановки не выполнено&lt;br /&gt;
    // E-шаг&lt;br /&gt;
    В цикле для каждого кластера&lt;br /&gt;
        Вычислить определитель матрицы ковариации Sigma;&lt;br /&gt;
        Вычислить обратную матрицу матрице Sigma;&lt;br /&gt;
    В цикле для каждого объекта&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Вычислить и запомнить p(x | mu, Sigma) для текущего объекта и кластера;&lt;br /&gt;
            Просуммировать вычисленные p(x | mu, Sigma);&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Обновить скрытые переменные gamma;&lt;br /&gt;
    // M-шаг&lt;br /&gt;
    Обновить веса w;&lt;br /&gt;
    Обновить центры кластеров mu;&lt;br /&gt;
    Обновить матрицы ковариации Sigma;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления определителя произвольной матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления матрицы, обратной произвольной матрице ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации - &amp;lt;math&amp;gt;O(K * M^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С учетом заранее вычисленных определителей и обратных матриц сложность вычисления &amp;lt;math&amp;gt;p(x | \mu,\Sigma)&amp;lt;/math&amp;gt; составит: &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага E составит &amp;lt;math&amp;gt;O(N * M^2 * K + K * M^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления весов кластеров &amp;lt;math&amp;gt;O(K * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления центров кластеров &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления одной матрицы ковариации &amp;lt;math&amp;gt;O(N * M)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления всех матриц ковариации &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага M алгоритма - &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит &amp;lt;math&amp;gt;O(K * M^2 * N + K * M^3 + K * M * N)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В предположении, что размерность объектов много меньше их количества &amp;lt;math&amp;gt;M &amp;lt;&amp;lt; N&amp;lt;/math&amp;gt; получим сложность итерации &amp;lt;math&amp;gt;O(K * M^2 * N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большу{{subst:ударение}}ю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее - вынесены за основной цикл шага E&amp;lt;ref name=ParallelEMComparissonGraphLab&amp;gt;Henggang Cui, Jinliang Wei, Wei Dai. Parallel Implementation of Expectation-Maximization for Fast Convergence - School of Computer Science, Carnegie Mellon University. [https://users.ece.cmu.edu/~hengganc/archive/report/final.pdf]&amp;lt;/ref&amp;gt;. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм&amp;lt;ref&amp;gt;Вячеслав Орешков. EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а суммарная сложность шага E и сложность всей итерации составит &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Макроструктура алгоритма представлена на рисунке 1 (см. [[#Макроструктура алгоритма|раздел 1.4]] статьи).&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 представлена схема вычислений E-шага алгоритма для одного объекта: для объекта &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и параметров &amp;lt;math&amp;gt;w_{j}, \mu_{j}, \Sigma_{j}, j=1..k&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются ненормированные значения скрытых переменных &amp;lt;math&amp;gt;g_{j}&amp;lt;/math&amp;gt;, нормировочный коэффициент &#039;&#039;normСoeff&#039;&#039;, и получаются итоговые значения &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step.png|thumb|center|400px|Рисунок 2: E-шаг EM алгоритма для одного объекта]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 представлена схема вычислений E-шага алгоритма для всех объектов: для объекта &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt; и параметров-векторов &amp;lt;math&amp;gt;w, \mu, \Sigma&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются значения скрытых переменных. &amp;lt;math&amp;gt;E_{i}, i=1..n&amp;lt;/math&amp;gt; - маркооперации, E-шаги для соответствующих объектов.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step_all.png|thumb|center|400px|Рисунок 3: E-шаг EM алгоритма для всех объектов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена схема вычислений M-шага алгоритма для одного кластера: для объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и скрытых переменных &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;, соответствующих степени принадлежности этих объектов кластеру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, согласно формулам шага M [[#Математическое описание алгоритма|раздела 1.2]] вычисляется нормировочный коэффициент &amp;lt;math&amp;gt;N_{j}&amp;lt;/math&amp;gt; и параметры этого кластера: вес &amp;lt;math&amp;gt;w_{j}^{new}&amp;lt;/math&amp;gt;, матрица ковариации &amp;lt;math&amp;gt;\Sigma_{j}^{new}&amp;lt;/math&amp;gt; и центр кластера &amp;lt;math&amp;gt;\mu_{j}^{new}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step.png|thumb|center|400px|Рисунок 4: M-шаг EM алгоритма для одного кластера]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена схема вычислений M-шага алгоритма для всех кластеров. &amp;lt;math&amp;gt;M_{j}, j=1..k&amp;lt;/math&amp;gt; соответствует макрооперации - M-шагу для соответствующего кластера и скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step_all.png|thumb|center|400px|Рисунок 5: M-шаг EM алгоритма для всех кластеров]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Из схем вычислений шагов E и M шагов алгоритма, приведенным в [[#Информационный граф|предыдущем разделе]], видно, что если размерность матрицы ковариации небольшая (тогда вычисление определителя и обратной матрицы матрице ковариации не является трудоемкой операцией), обе макрооперации EM алгоритма можно распараллеливать как по кластерам, так и по объектам.&lt;br /&gt;
&lt;br /&gt;
Как правило количество кластеров, на которые нужно разбить объекты, несравнимо меньше количества объектов, поэтому распараллеливание в большинстве существующих реализаций происходит по объектам: обработка объектов по возможности равномерно распределяются по кластерам. Теоретически (если считать передачу данных между процессорами мгновенной) при наличии неограниченного числа процессоров сложность алгоритма составит &amp;lt;math&amp;gt;O(m^2 * k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* Целое неотрицательное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
* Значения координат объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; объектов с &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; координатами каждый.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;n * m&amp;lt;/math&amp;gt; вещественных чисел (если координаты объектов - вещественные числа), &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целое неотрицательное число.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - для каждого объекта указан номер кластера, к которому он отнесен.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; целых неотрицательных чисел. &lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
=== Преимущества и недостатки ===&lt;br /&gt;
EM-алгоритм обладает следующими преимуществами и недостатками&amp;lt;ref&amp;gt;EM алгоритм, его модификации и обобщения. machinelearning.ru [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]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Преимущества:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Слабо чувствителен к выбросам&lt;br /&gt;
# Прост в реализации&lt;br /&gt;
# Быстро сходится при удачном выборе начальных значений параметров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Неустойчив к выбору начальных значений параметров - от них зависит как скорость сходимости, так и результат работы: алгоритм может сойтись к локальному экстремуму функции правдоподобия, который может быть существенно ниже глобального.&lt;br /&gt;
# Алгоритм не находит оптимальное количество кластеров. Количество кластеров, на которые нужно разбить множество объектов, является параметром алгоритма.&lt;br /&gt;
# При большой размерности пространства объектов выдвинутое предположение о модели их распределения может быть некорректным.&lt;br /&gt;
&lt;br /&gt;
=== Влияние структуры матрицы ковариации на форму кластера ===&lt;br /&gt;
&lt;br /&gt;
[[file:DifferentCovariance.png|thumb|center|800px|Рисунок 6: Влияние структуры матрицы ковариации на форму кластеров для двумерного случая. a) - матрицы ковариации являются диагональными, b) - матрицы ковариации произвольны. &amp;lt;ref&amp;gt;Mathworks: Clustering Using Gaussian Mixture Models [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 6 наглядно показывает, что при диагональной форме матриц ковариации полуоси эллипса (в общем случае - эллипсоида), соответствующего распределению объектов, отнесенных кластеру, параллельны осям координат объектов. В противном случае полуоси могут располагаться произвольным образом.&lt;br /&gt;
&lt;br /&gt;
=== Общие свойства ===&lt;br /&gt;
[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] EM алгоритма равна &amp;lt;math&amp;gt;m * k * it&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - размерность объекта, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров, а &amp;lt;math&amp;gt;it&amp;lt;/math&amp;gt; - количество итераций. &lt;br /&gt;
&lt;br /&gt;
EM-алгоритм является итерационным, и число итераций в общем случае не фиксировано: оно зависит от условий остановки, начальных приближений и расположения объектов. Поэтому этот алгоритм &#039;&#039;недетерминированный&#039;&#039;. По тем же причинам EM-алгоритм является &#039;&#039;неустойчивым&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
=== Инициализация параметров распределений ===&lt;br /&gt;
Наиболее распространены 3 способа инициализации центров распределений для EM алгоритма:&lt;br /&gt;
# центр распределения совпадает со случайно выбранным объектом &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
# все наблюдения распределяются по кластерам случайным образом, а затем для каждого кластера пересчитывается цент соответствующего распределения&lt;br /&gt;
# центры кластеров получаются в результате работы алгоритма k-means. Использование такой инициализации оправдано тем, что k-means требует меньших вычислительных затрат и быстрее сходится&amp;lt;ref&amp;gt;EM алгоритм (пример) machinelearning.ru [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])&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Многие статьи&amp;lt;ref name=FREERIDE&amp;gt;Leonid Glimcher, Gagan Agrawal. Parallelising EM Algorithm on a Cluster of SMPs [http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CV&amp;gt;López-de-Teruel P. E., García J. M., Acacio; The Parallel EM Algorithm and its Applications in Computer Vision [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=MULTITHREAD&amp;gt;Sharon X. Lee, Kaleb L. Leemaqz, Geoffrey J. McLachlan. A simple multithreaded implementation of the EM algorithm for mixture models [https://arxiv.org/pdf/1606.02054.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CUDA&amp;gt;Araújo, G.F., H.T. Macedo, M.T. Chella, C.A.E. Montesco and M.V.O. Medeiros. PARALLEL IMPLEMENTATION OF EXPECTATION-MAXIMISATION ALGORITHM FOR THE TRAINING OF GAUSSIAN MIXTURE MODELS [https://ri.ufs.br/bitstream/123456789/1764/1/ExpectationMaximisationAlgorithm.pdf]&amp;lt;/ref&amp;gt;, в которых представлены параллельные реализации EM алгоритма, описывают помимо использующихся программных и аппаратных решений результаты проведенных экспериментов с данными. В качестве примера в этом разделе будут рассмотрены результаты эксперементов, проведенных со связующим программным обеспечением (&#039;&#039;middleware&#039;&#039;) FREERIDE&amp;lt;ref&amp;gt;Leonid Glimchera, Ruoming Jinb, Gagan Agrawala. Middleware for data mining applications on clusters and grids [http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf]&amp;lt;/ref&amp;gt; (FRamework for Rapid Implementation of Datamining Engines), обеспечивающим возможность распараллеливания как для систем с общей памятью (в частности, симметричных мультипроцессорных систем), так и для систем с распределенной памятью.&lt;br /&gt;
&lt;br /&gt;
Эксперименты проводились на кластере машин Pentium 700MHz связанных при помощи Myrinet&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Myrinet&amp;lt;/ref&amp;gt; LANai 7.0 на трех наборах данных: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;а)&#039;&#039;&#039; 3.3 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; 6.2 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; 12.5 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
Объекты представляют собой координаты точек 10-мерного пространства.&lt;br /&gt;
 &lt;br /&gt;
Количество машин в кластере варьировалось от 1 до 8, при этом на каждой машине запускалось до четырех параллельных потоков.&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов представлены на рисунках 7-9&amp;lt;ref name=FREERIDE/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_a.png|thumb|center|350px|Рисунок 7: набор данных a)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_b.png|thumb|center|357px|Рисунок 8: набор данных b)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_c.png|thumb|center|351px|Рисунок 9: набор данных c)]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что используемые в данном исследовании машины, как и коммуникационная среда, сейчас не используются и считаются устаревшими, результат приведенных экспериментов наглядно показывает, что EM алгоритм хорошо параллелится, зависимость ускорения от числа узлов в кластере с небольшим количеством узлов близка к линейной, а также, что скорость работы алгоритма линейно зависит от числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Данный раздел может быть дополнен&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Примеры библиотек, содержащих последовательную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV(C++)] ([https://github.com/opencv/opencv/blob/master/modules/ml/src/em.cpp github])&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab]&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html Scikit learn (Python)]&lt;br /&gt;
# [http://mlpack.org/index.html MLPack(C++)]&lt;br /&gt;
&lt;br /&gt;
Примеры библиотек, содержащих параллельную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Здесь приводятся как конкретные реализации, так и статьи, описывающие подходы к реализациям распараллеливания EM-алгоритма&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# [https://spark.apache.org/ Apache Spark]&lt;br /&gt;
# [http://accord-framework.net/ Accord.NET Framework (C#)]&lt;br /&gt;
# Статья об использовании FREERIDE middleware для распараллеливания EM алгоритма &amp;lt;ref name=FREERIDE/&amp;gt; &lt;br /&gt;
# [http://andrewharp.com/gmmcuda реализация с использованием CUDA]&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MPI еще одна реализация с использованием CUDA]&lt;br /&gt;
# статья об использовании параллельного EM алгоритма в задачах компьютерного зрения &amp;lt;ref name=CV/&amp;gt;&lt;br /&gt;
# статья о распараллеливании EM алгоритма с использованием CUDA &amp;lt;ref name=CUDA/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Noite</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:Noite/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=16881</id>
		<title>Участник:Noite/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:Noite/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=16881"/>
		<updated>2016-11-14T10:15:17Z</updated>

		<summary type="html">&lt;p&gt;Noite: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(N * M^2 * K)&amp;lt;/math&amp;gt; - одна итерация&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;N * M + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Noite|Зинченко Д.А.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
В задачах оптимизации EM-алгоритмом называют итеративную процедуру поиска численного значения экстремума какой-либо функции. В частности, в статистике этот алгоритм используется для оценки максимального правдоподобия. Впервые название EM-алгоритм было предложено в 1977 году&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;, однако его идеи были описаны и раньше&amp;lt;ref name=korolev&amp;gt;В.Ю.Королёв. ЕМ-алгоритм, его модификации и их применение к задаче разделения смесей вероятностных распределений.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм применяется для решения задач двух типов &amp;lt;ref name=korolev/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Анализ неполных данных (данных с пропусками). &lt;br /&gt;
# Оценка максимального правдоподобия в случае, если функцию правдоподобия трудно исследовать аналитически. В этом случае введение набора скрытых переменных может существенно упростить задачу.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к задачам второго типа. В данной статье рассматривается следующая постановка задачи кластеризации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;Дано множество из N объектов, каждый из которых представляет собой точку в M-мерном метрическом пространстве. Каждому измерению пространства соответствует некоторое свойство объекта. Необходимо разбить это множество на K подмножеств (кластеров) так, чтобы, чтобы элементы каждого подмножества существенно отличались по свойствам от элементов других подмножеств.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование алгоритма EM подразумевает следующее &#039;&#039;предположение об объектах&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Пусть объекты, которые необходимо разбить на кластеры, появляются случайным образом и независимо друг от друга согласно вероятностному распределению, равному смеси (линейной комбинации) распределений кластеров. В данной статье в дальнейшем будет считаться, что распределение каждого кластера является многомерным нормальным распределением с произвольной матрицей ковариации - наиболее часто используемое предположение.&lt;br /&gt;
&lt;br /&gt;
Тогда каждый объект принадлежит каждому кластеру, но с разной вероятностью. EM-алгоритм итеративно оценивает параметры распределений кластеров, максимизируя логарифмическую функцию максимального правдоподобия. После окончания работы алгоритма объект будет отнесен к кластеру, вероятность принадлежности которому максимальна. Вводимый набор скрытых переменных для каждого объекта - вероятности того, что объект принадлежит каждому из кластеров.&lt;br /&gt;
&lt;br /&gt;
Итерация алгоритма состоит из двух последовательных шагов.&lt;br /&gt;
&lt;br /&gt;
# (Expectation) Вычисляются новые ожидаемые значения скрытых переменных.&lt;br /&gt;
# (Maximization) Решается задача максимизации правдоподобия: По текущим значениям скрытых переменных обновляются параметры распределений для кластеров: математическое ожидание, дисперсия и вероятность появления объектов из кластера.&lt;br /&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;N&amp;lt;/math&amp;gt; - количество объектов, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - количество параметров объекта&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\gamma_{n,k}&amp;lt;/math&amp;gt; - значения скрытых переменных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N_{k}&amp;lt;/math&amp;gt; - количество элементов отнесенных к соответствующему кластеру&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{1},...,x_n&amp;lt;/math&amp;gt; - объекты&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Параметры распределений:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{1},...,w_{k}&amp;lt;/math&amp;gt; - вероятности появления объектов из кластеров (веса кластеров), &amp;lt;math&amp;gt;\sum_{k=1}^Kw_{k}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{1},...,\mu_{k}&amp;lt;/math&amp;gt; - центры гауссиан кластеров&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma_{1},...,\Sigma_{k}&amp;lt;/math&amp;gt; - матрицы ковариации гауссиан кластеров, каждая матрица имеет размерность &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Смесь распределений:&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; P(x) = \sum_{j=1}^Kw_jp(x|\mu_{j}, \Sigma_{j})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Цель алгоритма - вычислить параметры распределений, максимизирующих логарифм функции правдоподобия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\ln P(x|w,\mu,\Sigma)= \sum_{n=1}^N \ln \{ \sum_{k=1}^K w_{k}p(x_{n}|\mu_{k},\Sigma_{k})\}&amp;lt;/math&amp;gt;.&amp;lt;/center&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
* В начале работы алгоритма задаются параметры начального приближения:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{i} = 1/K, \mu_{i} = random(x_{j}), i=1..K, j=1..N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{j,j}^{k}=\frac{1}{NK}\sum_{i=1}^N(x_{i,j} - \mu_{k,j})^2, k=1..K, j=1..M&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Поскольку от начального приближения может сильно зависеть результат работы алгоритма, вместо инициализации кластеров случайными центрами, равными весами и диагональными матрицами ковариации, как в приведенных формулах, часто применяют другие способы (подробнее - в [[#Особенности реализации последовательного алгоритма | особенностях реализации]])&#039;&#039;&lt;br /&gt;
* Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
** E-шаг: используя текущее значение параметров &amp;lt;math&amp;gt;w_{1},...,w_{k};\mu_{1},...,\mu_{k};\Sigma^{1},...,\Sigma^{k}&amp;lt;/math&amp;gt;, вычисляем значение вектора скрытых переменных &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\gamma_{n,k}=\frac{w_{k}p(x_{n}|\mu_{k},\Sigma^{k})}{\sum_{j=1}^K w_{j}p(x_{n}|\mu_{j},\Sigma^{j})}, &amp;lt;/math&amp;gt; знаменатель дроби - нормировочный коэффициент&amp;lt;/center&amp;gt;&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p(x|\mu,\Sigma)=\frac{1}{{(2\pi)}^{\frac{N}{2}}\sqrt{|\Sigma|}}exp\biggl\{-\frac{1}{2}{(x-\mu)}^T{\Sigma}^{-1}(x-\mu)\biggr\}&amp;lt;/math&amp;gt; - плотность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерного нормального распределения&amp;lt;/center&amp;gt;&lt;br /&gt;
** М-шаг: переоценка параметров по текущим значениям скрытых переменных для &amp;lt;math&amp;gt;k = 1..K&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\mu^{new}_{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k}x_{n}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{new}^{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k} (x_{n}-\mu_{k}^{new})(x_{n}-\mu_{k}^{new})^{T}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{k}^{new}=\frac{N_{k}}{N}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;N_{k}=\sum_{n=1}^N \gamma_{n,k}&amp;lt;/math&amp;gt;.&amp;lt;/center&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;
Вычислительное ядро алгоритма состоит из двух шагов, повторяющихся каждую итерацию:&lt;br /&gt;
*Обновление скрытых переменных на основе текущих параметров распределений&lt;br /&gt;
*Обновление параметров кластеров: весов, центров и матриц ковариации&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании вычислительного ядра алгоритма]], основную часть алгоритма составляют итеративно проводимые макрооперации: Expectation шаг - вычисление новых значений скрытых переменных, Maximization шаг - обновление параметров кластеров. Макроструктура алгоритма представлена на рисунке 1:&lt;br /&gt;
[[file:EM_macro.png|thumb|center|600px|Рисунок 1: Макроструктура EM-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Примерная схема реализации EM алгоритма с предварительной обработкой матриц ковариации:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
// n - количество объектов&lt;br /&gt;
&lt;br /&gt;
// m - количество координат объектов&lt;br /&gt;
&lt;br /&gt;
// k - количество кластеров&lt;br /&gt;
&lt;br /&gt;
Инициализировать веса и центры кластеров;&lt;br /&gt;
Инициализировать матрицы ковариации;&lt;br /&gt;
&lt;br /&gt;
// Основной цикл&lt;br /&gt;
Пока условие остановки не выполнено&lt;br /&gt;
    // E-шаг&lt;br /&gt;
    В цикле для каждого кластера&lt;br /&gt;
        Вычислить определитель матрицы ковариации Sigma;&lt;br /&gt;
        Вычислить обратную матрицу матрице Sigma;&lt;br /&gt;
    В цикле для каждого объекта&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Вычислить и запомнить p(x | mu, Sigma) для текущего объекта и кластера;&lt;br /&gt;
            Просуммировать вычисленные p(x | mu, Sigma);&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Обновить скрытые переменные gamma;&lt;br /&gt;
    // M-шаг&lt;br /&gt;
    Обновить веса w;&lt;br /&gt;
    Обновить центры кластеров mu;&lt;br /&gt;
    Обновить матрицы ковариации Sigma;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления определителя произвольной матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления матрицы, обратной произвольной матрице ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(M^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации - &amp;lt;math&amp;gt;O(K * M^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С учетом заранее вычисленных определителей и обратных матриц сложность вычисления &amp;lt;math&amp;gt;p(x | \mu,\Sigma)&amp;lt;/math&amp;gt; составит: &amp;lt;math&amp;gt;O(M^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага E составит &amp;lt;math&amp;gt;O(N * M^2 * K + K * M^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления весов кластеров &amp;lt;math&amp;gt;O(K * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления центров кластеров &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления одной матрицы ковариации &amp;lt;math&amp;gt;O(N * M)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления всех матриц ковариации &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага M алгоритма - &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит &amp;lt;math&amp;gt;O(K * M^2 * N + K * M^3 + K * M * N)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В предположении, что размерность объектов много меньше их количества &amp;lt;math&amp;gt;M &amp;lt;&amp;lt; N&amp;lt;/math&amp;gt; получим сложность итерации &amp;lt;math&amp;gt;O(K * M^2 * N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большу{{subst:&#039;}}ю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее - вынесены за основной цикл шага E&amp;lt;ref name=ParallelEMComparissonGraphLab&amp;gt;Henggang Cui, Jinliang Wei, Wei Dai. Parallel Implementation of Expectation-Maximization for Fast Convergence - School of Computer Science, Carnegie Mellon University. [https://users.ece.cmu.edu/~hengganc/archive/report/final.pdf]&amp;lt;/ref&amp;gt;. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм&amp;lt;ref&amp;gt;Вячеслав Орешков. EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt;, а суммарная сложность шага E и сложность всей итерации составит &amp;lt;math&amp;gt;O(K * M * N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Макроструктура алгоритма представлена на рисунке 1 (см. [[#Макроструктура алгоритма|раздел 1.4]] статьи).&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 представлена схема вычислений E-шага алгоритма для одного объекта: для объекта &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и параметров &amp;lt;math&amp;gt;w_{j}, \mu_{j}, \Sigma_{j}, j=1..k&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются ненормированные значения скрытых переменных &amp;lt;math&amp;gt;g_{j}&amp;lt;/math&amp;gt;, нормировочный коэффициент &#039;&#039;normСoeff&#039;&#039;, и получаются итоговые значения &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step.png|thumb|center|400px|Рисунок 2: E-шаг EM алгоритма для одного объекта]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 представлена схема вычислений E-шага алгоритма для всех объектов: для объекта &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt; и параметров-векторов &amp;lt;math&amp;gt;w, \mu, \Sigma&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются значения скрытых переменных. &amp;lt;math&amp;gt;E_{i}, i=1..n&amp;lt;/math&amp;gt; - маркооперации, E-шаги для соответствующих объектов.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step_all.png|thumb|center|400px|Рисунок 3: E-шаг EM алгоритма для всех объектов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена схема вычислений M-шага алгоритма для одного кластера: для объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и скрытых переменных &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;, соответствующих степени принадлежности этих объектов кластеру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, согласно формулам шага M [[#Математическое описание алгоритма|раздела 1.2]] вычисляется нормировочный коэффициент &amp;lt;math&amp;gt;N_{j}&amp;lt;/math&amp;gt; и параметры этого кластера: вес &amp;lt;math&amp;gt;w_{j}^{new}&amp;lt;/math&amp;gt;, матрица ковариации &amp;lt;math&amp;gt;\Sigma_{j}^{new}&amp;lt;/math&amp;gt; и центр кластера &amp;lt;math&amp;gt;\mu_{j}^{new}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step.png|thumb|center|400px|Рисунок 4: M-шаг EM алгоритма для одного кластера]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена схема вычислений M-шага алгоритма для всех кластеров. &amp;lt;math&amp;gt;M_{j}, j=1..k&amp;lt;/math&amp;gt; соответствует макрооперации - M-шагу для соответствующего кластера и скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step_all.png|thumb|center|400px|Рисунок 5: M-шаг EM алгоритма для всех кластеров]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Из схем вычислений шагов E и M шагов алгоритма, приведенным в [[#Информационный граф|предыдущем разделе]], видно, что если размерность матрицы ковариации небольшая (тогда вычисление определителя и обратной матрицы матрице ковариации не является трудоемкой операцией), обе макрооперации EM алгоритма можно распараллеливать как по кластерам, так и по объектам.&lt;br /&gt;
&lt;br /&gt;
Как правило количество кластеров, на которые нужно разбить объекты, несравнимо меньше количества объектов, поэтому распараллеливание в большинстве существующих реализаций происходит по объектам: обработка объектов по возможности равномерно распределяются по кластерам. Теоретически (если считать передачу данных между процессорами мгновенной) при наличии неограниченного числа процессоров сложность алгоритма составит &amp;lt;math&amp;gt;O(m^2 * k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* Целое неотрицательное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
* Значения координат объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; объектов с &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; координатами каждый.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;n * m&amp;lt;/math&amp;gt; вещественных чисел (если координаты объектов - вещественные числа), &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целое неотрицательное число.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - для каждого объекта указан номер кластера, к которому он отнесен.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; целых неотрицательных чисел. &lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
=== Преимущества и недостатки ===&lt;br /&gt;
EM-алгоритм обладает следующими преимуществами и недостатками&amp;lt;ref&amp;gt;EM алгоритм, его модификации и обобщения. machinelearning.ru [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]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Преимущества:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Слабо чувствителен к выбросам&lt;br /&gt;
# Прост в реализации&lt;br /&gt;
# Быстро сходится при удачном выборе начальных значений параметров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Неустойчив к выбору начальных значений параметров - от них зависит как скорость сходимости, так и результат работы: алгоритм может сойтись к локальному экстремуму функции правдоподобия, который может быть существенно ниже глобального.&lt;br /&gt;
# Алгоритм не находит оптимальное количество кластеров. Количество кластеров, на которые нужно разбить множество объектов, является параметром алгоритма.&lt;br /&gt;
# При большой размерности пространства объектов выдвинутое предположение о модели их распределения может быть некорректным.&lt;br /&gt;
&lt;br /&gt;
=== Влияние структуры матрицы ковариации на форму кластера ===&lt;br /&gt;
&lt;br /&gt;
[[file:DifferentCovariance.png|thumb|center|800px|Рисунок 6: Влияние структуры матрицы ковариации на форму кластеров для двумерного случая. a) - матрицы ковариации являются диагональными, b) - матрицы ковариации произвольны. &amp;lt;ref&amp;gt;Mathworks: Clustering Using Gaussian Mixture Models [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 6 наглядно показывает, что при диагональной форме матриц ковариации полуоси эллипса (в общем случае - эллипсоида), соответствующего распределению объектов, отнесенных кластеру, параллельны осям координат объектов. В противном случае полуоси могут располагаться произвольным образом.&lt;br /&gt;
&lt;br /&gt;
=== Общие свойства ===&lt;br /&gt;
[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] EM алгоритма равна &amp;lt;math&amp;gt;m * k * it&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - размерность объекта, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров, а &amp;lt;math&amp;gt;it&amp;lt;/math&amp;gt; - количество итераций. &lt;br /&gt;
&lt;br /&gt;
EM-алгоритм является итерационным, и число итераций в общем случае не фиксировано: оно зависит от условий остановки, начальных приближений и расположения объектов. Поэтому этот алгоритм &#039;&#039;недетерминированный&#039;&#039;. По тем же причинам EM-алгоритм является &#039;&#039;неустойчивым&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
=== Инициализация параметров распределений ===&lt;br /&gt;
Наиболее распространены 3 способа инициализации центров распределений для EM алгоритма:&lt;br /&gt;
# центр распределения совпадает со случайно выбранным объектом &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
# все наблюдения распределяются по кластерам случайным образом, а затем для каждого кластера пересчитывается цент соответствующего распределения&lt;br /&gt;
# центры кластеров получаются в результате работы алгоритма k-means. Использование такой инициализации оправдано тем, что k-means требует меньших вычислительных затрат и быстрее сходится&amp;lt;ref&amp;gt;EM алгоритм (пример) machinelearning.ru [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])&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Многие статьи&amp;lt;ref name=FREERIDE&amp;gt;Leonid Glimcher, Gagan Agrawal. Parallelising EM Algorithm on a Cluster of SMPs [http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CV&amp;gt;López-de-Teruel P. E., García J. M., Acacio; The Parallel EM Algorithm and its Applications in Computer Vision [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=MULTITHREAD&amp;gt;Sharon X. Lee, Kaleb L. Leemaqz, Geoffrey J. McLachlan. A simple multithreaded implementation of the EM algorithm for mixture models [https://arxiv.org/pdf/1606.02054.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CUDA&amp;gt;Araújo, G.F., H.T. Macedo, M.T. Chella, C.A.E. Montesco and M.V.O. Medeiros. PARALLEL IMPLEMENTATION OF EXPECTATION-MAXIMISATION ALGORITHM FOR THE TRAINING OF GAUSSIAN MIXTURE MODELS [https://ri.ufs.br/bitstream/123456789/1764/1/ExpectationMaximisationAlgorithm.pdf]&amp;lt;/ref&amp;gt;, в которых представлены параллельные реализации EM алгоритма, описывают помимо использующихся программных и аппаратных решений результаты проведенных экспериментов с данными. В качестве примера в этом разделе будут рассмотрены результаты эксперементов, проведенных со связующим программным обеспечением (&#039;&#039;middleware&#039;&#039;) FREERIDE&amp;lt;ref&amp;gt;Leonid Glimchera, Ruoming Jinb, Gagan Agrawala. Middleware for data mining applications on clusters and grids [http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf]&amp;lt;/ref&amp;gt; (FRamework for Rapid Implementation of Datamining Engines), обеспечивающим возможность распараллеливания как для систем с общей памятью (в частности, симметричных мультипроцессорных систем), так и для систем с распределенной памятью.&lt;br /&gt;
&lt;br /&gt;
Эксперименты проводились на кластере машин Pentium 700MHz связанных при помощи Myrinet&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Myrinet&amp;lt;/ref&amp;gt; LANai 7.0 на трех наборах данных: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;а)&#039;&#039;&#039; 3.3 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; 6.2 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; 12.5 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
Объекты представляют собой координаты точек 10-мерного пространства.&lt;br /&gt;
 &lt;br /&gt;
Количество машин в кластере варьировалось от 1 до 8, при этом на каждой машине запускалось до четырех параллельных потоков.&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов представлены на рисунках 7-9&amp;lt;ref name=FREERIDE/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_a.png|thumb|center|350px|Рисунок 7: набор данных a)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_b.png|thumb|center|357px|Рисунок 8: набор данных b)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_c.png|thumb|center|351px|Рисунок 9: набор данных c)]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что используемые в данном исследовании машины, как и коммуникационная среда, сейчас не используются и считаются устаревшими, результат приведенных экспериментов наглядно показывает, что EM алгоритм хорошо параллелится, зависимость ускорения от числа узлов в кластере с небольшим количеством узлов близка к линейной, а также, что скорость работы алгоритма линейно зависит от числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Данный раздел может быть дополнен&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Примеры библиотек, содержащих последовательную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV(C++)] ([https://github.com/opencv/opencv/blob/master/modules/ml/src/em.cpp github])&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab]&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html Scikit learn (Python)]&lt;br /&gt;
# [http://mlpack.org/index.html MLPack(C++)]&lt;br /&gt;
&lt;br /&gt;
Примеры библиотек, содержащих параллельную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Здесь приводятся как конкретные реализации, так и статьи, описывающие подходы к реализациям распараллеливания EM-алгоритма&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# [https://spark.apache.org/ Apache Spark]&lt;br /&gt;
# [http://accord-framework.net/ Accord.NET Framework (C#)]&lt;br /&gt;
# Статья об использовании FREERIDE middleware для распараллеливания EM алгоритма &amp;lt;ref name=FREERIDE/&amp;gt; &lt;br /&gt;
# [http://andrewharp.com/gmmcuda реализация с использованием CUDA]&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MPI еще одна реализация с использованием CUDA]&lt;br /&gt;
# статья об использовании параллельного EM алгоритма в задачах компьютерного зрения &amp;lt;ref name=CV/&amp;gt;&lt;br /&gt;
# статья о распараллеливании EM алгоритма с использованием CUDA &amp;lt;ref name=CUDA/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Noite</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:Noite/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=16880</id>
		<title>Участник:Noite/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:Noite/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=16880"/>
		<updated>2016-11-14T10:00:39Z</updated>

		<summary type="html">&lt;p&gt;Noite: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(N * M^2 * K)&amp;lt;/math&amp;gt; - одна итерация&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;N * M + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Noite|Зинченко Д.А.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
В задачах оптимизации EM-алгоритмом называют итеративную процедуру поиска численного значения экстремума какой-либо функции. В частности, в статистике этот алгоритм используется для оценки максимального правдоподобия. Впервые название EM-алгоритм было предложено в 1977 году&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;, однако его идеи были описаны и раньше&amp;lt;ref name=korolev&amp;gt;В.Ю.Королёв. ЕМ-алгоритм, его модификации и их применение к задаче разделения смесей вероятностных распределений.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм применяется для решения задач двух типов &amp;lt;ref name=korolev/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Анализ неполных данных (данных с пропусками). &lt;br /&gt;
# Оценка максимального правдоподобия в случае, если функцию правдоподобия трудно исследовать аналитически. В этом случае введение набора скрытых переменных может существенно упростить задачу.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к задачам второго типа. В данной статье рассматривается следующая постановка задачи кластеризации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;Дано множество из N объектов, каждый из которых представляет собой точку в M-мерном метрическом пространстве. Каждому измерению пространства соответствует некоторое свойство объекта. Необходимо разбить это множество на K подмножеств (кластеров) так, чтобы, чтобы элементы каждого подмножества существенно отличались по свойствам от элементов других подмножеств.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование алгоритма EM подразумевает следующее &#039;&#039;предположение об объектах&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Пусть объекты, которые необходимо разбить на кластеры, появляются случайным образом и независимо друг от друга согласно вероятностному распределению, равному смеси (линейной комбинации) распределений кластеров. В данной статье в дальнейшем будет считаться, что распределение каждого кластера является многомерным нормальным распределением с произвольной матрицей ковариации - наиболее часто используемое предположение.&lt;br /&gt;
&lt;br /&gt;
Тогда каждый объект принадлежит каждому кластеру, но с разной вероятностью. EM-алгоритм итеративно оценивает параметры распределений кластеров, максимизируя логарифмическую функцию максимального правдоподобия. После окончания работы алгоритма объект будет отнесен к кластеру, вероятность принадлежности которому максимальна. Вводимый набор скрытых переменных для каждого объекта - вероятности того, что объект принадлежит каждому из кластеров.&lt;br /&gt;
&lt;br /&gt;
Итерация алгоритма состоит из двух последовательных шагов.&lt;br /&gt;
&lt;br /&gt;
# (Expectation) Вычисляются новые ожидаемые значения скрытых переменных.&lt;br /&gt;
# (Maximization) Решается задача максимизации правдоподобия: По текущим значениям скрытых переменных обновляются параметры распределений для кластеров: математическое ожидание, дисперсия и вероятность появления объектов из кластера.&lt;br /&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;N&amp;lt;/math&amp;gt; - количество объектов, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - количество параметров объекта&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\gamma_{n,k}&amp;lt;/math&amp;gt; - значения скрытых переменных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N_{k}&amp;lt;/math&amp;gt; - количество элементов отнесенных к соответствующему кластеру&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{1},...,x_n&amp;lt;/math&amp;gt; - объекты&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Параметры распределений:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{1},...,w_{k}&amp;lt;/math&amp;gt; - вероятности появления объектов из кластеров (веса кластеров), &amp;lt;math&amp;gt;\sum_{k=1}^Kw_{k}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{1},...,\mu_{k}&amp;lt;/math&amp;gt; - центры гауссиан кластеров&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma_{1},...,\Sigma_{k}&amp;lt;/math&amp;gt; - матрицы ковариации гауссиан кластеров, каждая матрица имеет размерность &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Смесь распределений:&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; P(x) = \sum_{j=1}^Kw_jp(x|\mu_{j}, \Sigma_{j})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Цель алгоритма - вычислить параметры распределений, максимизирующих логарифм функции правдоподобия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\ln P(x|w,\mu,\Sigma)= \sum_{n=1}^N \ln \{ \sum_{k=1}^K w_{k}p(x_{n}|\mu_{k},\Sigma_{k})\}&amp;lt;/math&amp;gt;.&amp;lt;/center&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
* В начале работы алгоритма задаются параметры начального приближения:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{i} = 1/K, \mu_{i} = random(x_{j}), i=1..K, j=1..N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{j,j}^{k}=\frac{1}{NK}\sum_{i=1}^N(x_{i,j} - \mu_{k,j})^2, k=1..K, j=1..M&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Поскольку от начального приближения может сильно зависеть результат работы алгоритма, вместо инициализации кластеров случайными центрами, равными весами и диагональными матрицами ковариации, как в приведенных формулах, часто применяют другие способы (подробнее - в [[#Особенности реализации последовательного алгоритма | особенностях реализации]])&#039;&#039;&lt;br /&gt;
* Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
** E-шаг: используя текущее значение параметров &amp;lt;math&amp;gt;w_{1},...,w_{k};\mu_{1},...,\mu_{k};\Sigma^{1},...,\Sigma^{k}&amp;lt;/math&amp;gt;, вычисляем значение вектора скрытых переменных &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\gamma_{n,k}=\frac{w_{k}p(x_{n}|\mu_{k},\Sigma^{k})}{\sum_{j=1}^K w_{j}p(x_{n}|\mu_{j},\Sigma^{j})}, &amp;lt;/math&amp;gt; знаменатель дроби - нормировочный коэффициент&amp;lt;/center&amp;gt;&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p(x|\mu,\Sigma)=\frac{1}{{(2\pi)}^{\frac{N}{2}}\sqrt{|\Sigma|}}exp\biggl\{-\frac{1}{2}{(x-\mu)}^T{\Sigma}^{-1}(x-\mu)\biggr\}&amp;lt;/math&amp;gt; - плотность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерного нормального распределения&amp;lt;/center&amp;gt;&lt;br /&gt;
** М-шаг: переоценка параметров по текущим значениям скрытых переменных для &amp;lt;math&amp;gt;k = 1..K&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\mu^{new}_{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k}x_{n}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{new}^{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k} (x_{n}-\mu_{k}^{new})(x_{n}-\mu_{k}^{new})^{T}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{k}^{new}=\frac{N_{k}}{N}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;N_{k}=\sum_{n=1}^N \gamma_{n,k}&amp;lt;/math&amp;gt;.&amp;lt;/center&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;
Вычислительное ядро алгоритма состоит из двух шагов, повторяющихся каждую итерацию:&lt;br /&gt;
*Обновление скрытых переменных на основе текущих параметров распределений&lt;br /&gt;
*Обновление параметров кластеров: весов, центров и матриц ковариации&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании вычислительного ядра алгоритма]], основную часть алгоритма составляют итеративно проводимые макрооперации: Expectation шаг - вычисление новых значений скрытых переменных, Maximization шаг - обновление параметров кластеров. Макроструктура алгоритма представлена на рисунке 1:&lt;br /&gt;
[[file:EM_macro.png|thumb|center|600px|Рисунок 1: Макроструктура EM-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Примерная схема реализации EM алгоритма с предварительной обработкой матриц ковариации:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
// n - количество объектов&lt;br /&gt;
&lt;br /&gt;
// m - количество координат объектов&lt;br /&gt;
&lt;br /&gt;
// k - количество кластеров&lt;br /&gt;
&lt;br /&gt;
Инициализировать веса и центры кластеров;&lt;br /&gt;
Инициализировать матрицы ковариации;&lt;br /&gt;
&lt;br /&gt;
// Основной цикл&lt;br /&gt;
Пока условие остановки не выполнено&lt;br /&gt;
    // E-шаг&lt;br /&gt;
    В цикле для каждого кластера&lt;br /&gt;
        Вычислить определитель матрицы ковариации Sigma;&lt;br /&gt;
        Вычислить обратную матрицу матрице Sigma;&lt;br /&gt;
    В цикле для каждого объекта&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Вычислить и запомнить p(x | mu, Sigma) для текущего объекта и кластера;&lt;br /&gt;
            Просуммировать вычисленные p(x | mu, Sigma);&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Обновить скрытые переменные gamma;&lt;br /&gt;
    // M-шаг&lt;br /&gt;
    Обновить веса w;&lt;br /&gt;
    Обновить центры кластеров mu;&lt;br /&gt;
    Обновить матрицы ковариации Sigma;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления определителя произвольной матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления матрицы, обратной произвольной матрице ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации - &amp;lt;math&amp;gt;O(k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С учетом заранее вычисленных определителей и обратных матриц сложность вычисления &amp;lt;math&amp;gt;p(x | \mu,\Sigma)&amp;lt;/math&amp;gt; составит: &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага E составит &amp;lt;math&amp;gt;O(n * m^2 * k + k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления весов кластеров &amp;lt;math&amp;gt;O(k * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления центров кластеров &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления одной матрицы ковариации &amp;lt;math&amp;gt;O(n * m)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления всех матриц ковариации &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага M алгоритма - &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит &amp;lt;math&amp;gt;O(k * m^2 * n + k * m^3 + k * m * n)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В предположении, что размерность объектов много меньше их количества &amp;lt;math&amp;gt;m &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt; получим сложность итерации &amp;lt;math&amp;gt;O(k * m^2 * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большУю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее - вынесены за основной цикл шага E&amp;lt;ref name=ParallelEMComparissonGraphLab&amp;gt;Henggang Cui, Jinliang Wei, Wei Dai. Parallel Implementation of Expectation-Maximization for Fast Convergence - School of Computer Science, Carnegie Mellon University. [https://users.ece.cmu.edu/~hengganc/archive/report/final.pdf]&amp;lt;/ref&amp;gt;. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм&amp;lt;ref&amp;gt;Вячеслав Орешков. EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, а суммарная сложность шага E и сложность всей итерации составит &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Макроструктура алгоритма представлена на рисунке 1 (см. [[#Макроструктура алгоритма|раздел 1.4]] статьи).&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 представлена схема вычислений E-шага алгоритма для одного объекта: для объекта &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и параметров &amp;lt;math&amp;gt;w_{j}, \mu_{j}, \Sigma_{j}, j=1..k&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются ненормированные значения скрытых переменных &amp;lt;math&amp;gt;g_{j}&amp;lt;/math&amp;gt;, нормировочный коэффициент &#039;&#039;normСoeff&#039;&#039;, и получаются итоговые значения &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step.png|thumb|center|400px|Рисунок 2: E-шаг EM алгоритма для одного объекта]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 представлена схема вычислений E-шага алгоритма для всех объектов: для объекта &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt; и параметров-векторов &amp;lt;math&amp;gt;w, \mu, \Sigma&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются значения скрытых переменных. &amp;lt;math&amp;gt;E_{i}, i=1..n&amp;lt;/math&amp;gt; - маркооперации, E-шаги для соответствующих объектов.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step_all.png|thumb|center|400px|Рисунок 3: E-шаг EM алгоритма для всех объектов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена схема вычислений M-шага алгоритма для одного кластера: для объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и скрытых переменных &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;, соответствующих степени принадлежности этих объектов кластеру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, согласно формулам шага M [[#Математическое описание алгоритма|раздела 1.2]] вычисляется нормировочный коэффициент &amp;lt;math&amp;gt;N_{j}&amp;lt;/math&amp;gt; и параметры этого кластера: вес &amp;lt;math&amp;gt;w_{j}^{new}&amp;lt;/math&amp;gt;, матрица ковариации &amp;lt;math&amp;gt;\Sigma_{j}^{new}&amp;lt;/math&amp;gt; и центр кластера &amp;lt;math&amp;gt;\mu_{j}^{new}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step.png|thumb|center|400px|Рисунок 4: M-шаг EM алгоритма для одного кластера]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена схема вычислений M-шага алгоритма для всех кластеров. &amp;lt;math&amp;gt;M_{j}, j=1..k&amp;lt;/math&amp;gt; соответствует макрооперации - M-шагу для соответствующего кластера и скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step_all.png|thumb|center|400px|Рисунок 5: M-шаг EM алгоритма для всех кластеров]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Из схем вычислений шагов E и M шагов алгоритма, приведенным в [[#Информационный граф|предыдущем разделе]], видно, что если размерность матрицы ковариации небольшая (тогда вычисление определителя и обратной матрицы матрице ковариации не является трудоемкой операцией), обе макрооперации EM алгоритма можно распараллеливать как по кластерам, так и по объектам.&lt;br /&gt;
&lt;br /&gt;
Как правило количество кластеров, на которые нужно разбить объекты, несравнимо меньше количества объектов, поэтому распараллеливание в большинстве существующих реализаций происходит по объектам: обработка объектов по возможности равномерно распределяются по кластерам. Теоретически (если считать передачу данных между процессорами мгновенной) при наличии неограниченного числа процессоров сложность алгоритма составит &amp;lt;math&amp;gt;O(m^2 * k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* Целое неотрицательное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
* Значения координат объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; объектов с &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; координатами каждый.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;n * m&amp;lt;/math&amp;gt; вещественных чисел (если координаты объектов - вещественные числа), &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целое неотрицательное число.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - для каждого объекта указан номер кластера, к которому он отнесен.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; целых неотрицательных чисел. &lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
=== Преимущества и недостатки ===&lt;br /&gt;
EM-алгоритм обладает следующими преимуществами и недостатками&amp;lt;ref&amp;gt;EM алгоритм, его модификации и обобщения. machinelearning.ru [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]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Преимущества:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Слабо чувствителен к выбросам&lt;br /&gt;
# Прост в реализации&lt;br /&gt;
# Быстро сходится при удачном выборе начальных значений параметров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Неустойчив к выбору начальных значений параметров - от них зависит как скорость сходимости, так и результат работы: алгоритм может сойтись к локальному экстремуму функции правдоподобия, который может быть существенно ниже глобального.&lt;br /&gt;
# Алгоритм не находит оптимальное количество кластеров. Количество кластеров, на которые нужно разбить множество объектов, является параметром алгоритма.&lt;br /&gt;
# При большой размерности пространства объектов выдвинутое предположение о модели их распределения может быть некорректным.&lt;br /&gt;
&lt;br /&gt;
=== Влияние структуры матрицы ковариации на форму кластера ===&lt;br /&gt;
&lt;br /&gt;
[[file:DifferentCovariance.png|thumb|center|800px|Рисунок 6: Влияние структуры матрицы ковариации на форму кластеров для двумерного случая. a) - матрицы ковариации являются диагональными, b) - матрицы ковариации произвольны. &amp;lt;ref&amp;gt;Mathworks: Clustering Using Gaussian Mixture Models [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 6 наглядно показывает, что при диагональной форме матриц ковариации полуоси эллипса (в общем случае - эллипсоида), соответствующего распределению объектов, отнесенных кластеру, параллельны осям координат объектов. В противном случае полуоси могут располагаться произвольным образом.&lt;br /&gt;
&lt;br /&gt;
=== Общие свойства ===&lt;br /&gt;
[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] EM алгоритма равна &amp;lt;math&amp;gt;m * k * it&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - размерность объекта, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров, а &amp;lt;math&amp;gt;it&amp;lt;/math&amp;gt; - количество итераций. &lt;br /&gt;
&lt;br /&gt;
EM-алгоритм является итерационным, и число итераций в общем случае не фиксировано: оно зависит от условий остановки, начальных приближений и расположения объектов. Поэтому этот алгоритм &#039;&#039;недетерминированный&#039;&#039;. По тем же причинам EM-алгоритм является &#039;&#039;неустойчивым&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
=== Инициализация параметров распределений ===&lt;br /&gt;
Наиболее распространены 3 способа инициализации центров распределений для EM алгоритма:&lt;br /&gt;
# центр распределения совпадает со случайно выбранным объектом &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
# все наблюдения распределяются по кластерам случайным образом, а затем для каждого кластера пересчитывается цент соответствующего распределения&lt;br /&gt;
# центры кластеров получаются в результате работы алгоритма k-means. Использование такой инициализации оправдано тем, что k-means требует меньших вычислительных затрат и быстрее сходится&amp;lt;ref&amp;gt;EM алгоритм (пример) machinelearning.ru [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])&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Многие статьи&amp;lt;ref name=FREERIDE&amp;gt;Leonid Glimcher, Gagan Agrawal. Parallelising EM Algorithm on a Cluster of SMPs [http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CV&amp;gt;López-de-Teruel P. E., García J. M., Acacio; The Parallel EM Algorithm and its Applications in Computer Vision [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=MULTITHREAD&amp;gt;Sharon X. Lee, Kaleb L. Leemaqz, Geoffrey J. McLachlan. A simple multithreaded implementation of the EM algorithm for mixture models [https://arxiv.org/pdf/1606.02054.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CUDA&amp;gt;Araújo, G.F., H.T. Macedo, M.T. Chella, C.A.E. Montesco and M.V.O. Medeiros. PARALLEL IMPLEMENTATION OF EXPECTATION-MAXIMISATION ALGORITHM FOR THE TRAINING OF GAUSSIAN MIXTURE MODELS [https://ri.ufs.br/bitstream/123456789/1764/1/ExpectationMaximisationAlgorithm.pdf]&amp;lt;/ref&amp;gt;, в которых представлены параллельные реализации EM алгоритма, описывают помимо использующихся программных и аппаратных решений результаты проведенных экспериментов с данными. В качестве примера в этом разделе будут рассмотрены результаты эксперементов, проведенных со связующим программным обеспечением (&#039;&#039;middleware&#039;&#039;) FREERIDE&amp;lt;ref&amp;gt;Leonid Glimchera, Ruoming Jinb, Gagan Agrawala. Middleware for data mining applications on clusters and grids [http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf]&amp;lt;/ref&amp;gt; (FRamework for Rapid Implementation of Datamining Engines), обеспечивающим возможность распараллеливания как для систем с общей памятью (в частности, симметричных мультипроцессорных систем), так и для систем с распределенной памятью.&lt;br /&gt;
&lt;br /&gt;
Эксперименты проводились на кластере машин Pentium 700MHz связанных при помощи Myrinet&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Myrinet&amp;lt;/ref&amp;gt; LANai 7.0 на трех наборах данных: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;а)&#039;&#039;&#039; 3.3 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; 6.2 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; 12.5 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
Объекты представляют собой координаты точек 10-мерного пространства.&lt;br /&gt;
 &lt;br /&gt;
Количество машин в кластере варьировалось от 1 до 8, при этом на каждой машине запускалось до четырех параллельных потоков.&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов представлены на рисунках 7-9&amp;lt;ref name=FREERIDE/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_a.png|thumb|center|350px|Рисунок 7: набор данных a)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_b.png|thumb|center|357px|Рисунок 8: набор данных b)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_c.png|thumb|center|351px|Рисунок 9: набор данных c)]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что используемые в данном исследовании машины, как и коммуникационная среда, сейчас не используются и считаются устаревшими, результат приведенных экспериментов наглядно показывает, что EM алгоритм хорошо параллелится, зависимость ускорения от числа узлов в кластере с небольшим количеством узлов близка к линейной, а также, что скорость работы алгоритма линейно зависит от числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Данный раздел может быть дополнен&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Примеры библиотек, содержащих последовательную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV(C++)] ([https://github.com/opencv/opencv/blob/master/modules/ml/src/em.cpp github])&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab]&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html Scikit learn (Python)]&lt;br /&gt;
# [http://mlpack.org/index.html MLPack(C++)]&lt;br /&gt;
&lt;br /&gt;
Примеры библиотек, содержащих параллельную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Здесь приводятся как конкретные реализации, так и статьи, описывающие подходы к реализациям распараллеливания EM-алгоритма&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# [https://spark.apache.org/ Apache Spark]&lt;br /&gt;
# [http://accord-framework.net/ Accord.NET Framework (C#)]&lt;br /&gt;
# Статья об использовании FREERIDE middleware для распараллеливания EM алгоритма &amp;lt;ref name=FREERIDE/&amp;gt; &lt;br /&gt;
# [http://andrewharp.com/gmmcuda реализация с использованием CUDA]&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MPI еще одна реализация с использованием CUDA]&lt;br /&gt;
# статья об использовании параллельного EM алгоритма в задачах компьютерного зрения &amp;lt;ref name=CV/&amp;gt;&lt;br /&gt;
# статья о распараллеливании EM алгоритма с использованием CUDA &amp;lt;ref name=CUDA/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Noite</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:Noite/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=16879</id>
		<title>Участник:Noite/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:Noite/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=16879"/>
		<updated>2016-11-14T10:00:04Z</updated>

		<summary type="html">&lt;p&gt;Noite: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(N * M^2 * K)&amp;lt;/math&amp;gt; - одна итерация&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;N * M + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Noite|Зинченко Д.А.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
В задачах оптимизации EM-алгоритмом называют итеративную процедуру поиска численного значения экстремума какой-либо функции. В частности, в статистике этот алгоритм используется для оценки максимального правдоподобия. Впервые название EM-алгоритм было предложено в 1977 году&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;, однако его идеи были описаны и раньше&amp;lt;ref name=korolev&amp;gt;В.Ю.Королёв. ЕМ-алгоритм, его модификации и их применение к задаче разделения смесей вероятностных распределений.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм применяется для решения задач двух типов &amp;lt;ref name=korolev/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Анализ неполных данных (данных с пропусками). &lt;br /&gt;
# Оценка максимального правдоподобия в случае, если функцию правдоподобия трудно исследовать аналитически. В этом случае введение набора скрытых переменных может существенно упростить задачу.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к задачам второго типа. В данной статье рассматривается следующая постановка задачи кластеризации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;Дано множество из N объектов, каждый из которых представляет собой точку в M-мерном метрическом пространстве. Каждому измерению пространства соответствует некоторое свойство объекта. Необходимо разбить это множество на K подмножеств так, чтобы, чтобы элементы каждого подмножества существенно отличались по свойствам от элементов других подмножеств.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование алгоритма EM подразумевает следующее &#039;&#039;предположение об объектах&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Пусть объекты, которые необходимо разбить на кластеры, появляются случайным образом и независимо друг от друга согласно вероятностному распределению, равному смеси (линейной комбинации) распределений кластеров. В данной статье в дальнейшем будет считаться, что распределение каждого кластера является многомерным нормальным распределением с произвольной матрицей ковариации - наиболее часто используемое предположение.&lt;br /&gt;
&lt;br /&gt;
Тогда каждый объект принадлежит каждому кластеру, но с разной вероятностью. EM-алгоритм итеративно оценивает параметры распределений кластеров, максимизируя логарифмическую функцию максимального правдоподобия. После окончания работы алгоритма объект будет отнесен к кластеру, вероятность принадлежности которому максимальна. Вводимый набор скрытых переменных для каждого объекта - вероятности того, что объект принадлежит каждому из кластеров.&lt;br /&gt;
&lt;br /&gt;
Итерация алгоритма состоит из двух последовательных шагов.&lt;br /&gt;
&lt;br /&gt;
# (Expectation) Вычисляются новые ожидаемые значения скрытых переменных.&lt;br /&gt;
# (Maximization) Решается задача максимизации правдоподобия: По текущим значениям скрытых переменных обновляются параметры распределений для кластеров: математическое ожидание, дисперсия и вероятность появления объектов из кластера.&lt;br /&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;N&amp;lt;/math&amp;gt; - количество объектов, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - количество параметров объекта&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\gamma_{n,k}&amp;lt;/math&amp;gt; - значения скрытых переменных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N_{k}&amp;lt;/math&amp;gt; - количество элементов отнесенных к соответствующему кластеру&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{1},...,x_n&amp;lt;/math&amp;gt; - объекты&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Параметры распределений:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{1},...,w_{k}&amp;lt;/math&amp;gt; - вероятности появления объектов из кластеров (веса кластеров), &amp;lt;math&amp;gt;\sum_{k=1}^Kw_{k}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{1},...,\mu_{k}&amp;lt;/math&amp;gt; - центры гауссиан кластеров&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma_{1},...,\Sigma_{k}&amp;lt;/math&amp;gt; - матрицы ковариации гауссиан кластеров, каждая матрица имеет размерность &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Смесь распределений:&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; P(x) = \sum_{j=1}^Kw_jp(x|\mu_{j}, \Sigma_{j})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Цель алгоритма - вычислить параметры распределений, максимизирующих логарифм функции правдоподобия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\ln P(x|w,\mu,\Sigma)= \sum_{n=1}^N \ln \{ \sum_{k=1}^K w_{k}p(x_{n}|\mu_{k},\Sigma_{k})\}&amp;lt;/math&amp;gt;.&amp;lt;/center&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
* В начале работы алгоритма задаются параметры начального приближения:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{i} = 1/K, \mu_{i} = random(x_{j}), i=1..K, j=1..N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{j,j}^{k}=\frac{1}{NK}\sum_{i=1}^N(x_{i,j} - \mu_{k,j})^2, k=1..K, j=1..M&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Поскольку от начального приближения может сильно зависеть результат работы алгоритма, вместо инициализации кластеров случайными центрами, равными весами и диагональными матрицами ковариации, как в приведенных формулах, часто применяют другие способы (подробнее - в [[#Особенности реализации последовательного алгоритма | особенностях реализации]])&#039;&#039;&lt;br /&gt;
* Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
** E-шаг: используя текущее значение параметров &amp;lt;math&amp;gt;w_{1},...,w_{k};\mu_{1},...,\mu_{k};\Sigma^{1},...,\Sigma^{k}&amp;lt;/math&amp;gt;, вычисляем значение вектора скрытых переменных &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\gamma_{n,k}=\frac{w_{k}p(x_{n}|\mu_{k},\Sigma^{k})}{\sum_{j=1}^K w_{j}p(x_{n}|\mu_{j},\Sigma^{j})}, &amp;lt;/math&amp;gt; знаменатель дроби - нормировочный коэффициент&amp;lt;/center&amp;gt;&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p(x|\mu,\Sigma)=\frac{1}{{(2\pi)}^{\frac{N}{2}}\sqrt{|\Sigma|}}exp\biggl\{-\frac{1}{2}{(x-\mu)}^T{\Sigma}^{-1}(x-\mu)\biggr\}&amp;lt;/math&amp;gt; - плотность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерного нормального распределения&amp;lt;/center&amp;gt;&lt;br /&gt;
** М-шаг: переоценка параметров по текущим значениям скрытых переменных для &amp;lt;math&amp;gt;k = 1..K&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\mu^{new}_{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k}x_{n}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{new}^{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k} (x_{n}-\mu_{k}^{new})(x_{n}-\mu_{k}^{new})^{T}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{k}^{new}=\frac{N_{k}}{N}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;N_{k}=\sum_{n=1}^N \gamma_{n,k}&amp;lt;/math&amp;gt;.&amp;lt;/center&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;
Вычислительное ядро алгоритма состоит из двух шагов, повторяющихся каждую итерацию:&lt;br /&gt;
*Обновление скрытых переменных на основе текущих параметров распределений&lt;br /&gt;
*Обновление параметров кластеров: весов, центров и матриц ковариации&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании вычислительного ядра алгоритма]], основную часть алгоритма составляют итеративно проводимые макрооперации: Expectation шаг - вычисление новых значений скрытых переменных, Maximization шаг - обновление параметров кластеров. Макроструктура алгоритма представлена на рисунке 1:&lt;br /&gt;
[[file:EM_macro.png|thumb|center|600px|Рисунок 1: Макроструктура EM-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Примерная схема реализации EM алгоритма с предварительной обработкой матриц ковариации:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
// n - количество объектов&lt;br /&gt;
&lt;br /&gt;
// m - количество координат объектов&lt;br /&gt;
&lt;br /&gt;
// k - количество кластеров&lt;br /&gt;
&lt;br /&gt;
Инициализировать веса и центры кластеров;&lt;br /&gt;
Инициализировать матрицы ковариации;&lt;br /&gt;
&lt;br /&gt;
// Основной цикл&lt;br /&gt;
Пока условие остановки не выполнено&lt;br /&gt;
    // E-шаг&lt;br /&gt;
    В цикле для каждого кластера&lt;br /&gt;
        Вычислить определитель матрицы ковариации Sigma;&lt;br /&gt;
        Вычислить обратную матрицу матрице Sigma;&lt;br /&gt;
    В цикле для каждого объекта&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Вычислить и запомнить p(x | mu, Sigma) для текущего объекта и кластера;&lt;br /&gt;
            Просуммировать вычисленные p(x | mu, Sigma);&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Обновить скрытые переменные gamma;&lt;br /&gt;
    // M-шаг&lt;br /&gt;
    Обновить веса w;&lt;br /&gt;
    Обновить центры кластеров mu;&lt;br /&gt;
    Обновить матрицы ковариации Sigma;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления определителя произвольной матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления матрицы, обратной произвольной матрице ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации - &amp;lt;math&amp;gt;O(k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С учетом заранее вычисленных определителей и обратных матриц сложность вычисления &amp;lt;math&amp;gt;p(x | \mu,\Sigma)&amp;lt;/math&amp;gt; составит: &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага E составит &amp;lt;math&amp;gt;O(n * m^2 * k + k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления весов кластеров &amp;lt;math&amp;gt;O(k * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления центров кластеров &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления одной матрицы ковариации &amp;lt;math&amp;gt;O(n * m)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления всех матриц ковариации &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага M алгоритма - &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит &amp;lt;math&amp;gt;O(k * m^2 * n + k * m^3 + k * m * n)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В предположении, что размерность объектов много меньше их количества &amp;lt;math&amp;gt;m &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt; получим сложность итерации &amp;lt;math&amp;gt;O(k * m^2 * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большУю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее - вынесены за основной цикл шага E&amp;lt;ref name=ParallelEMComparissonGraphLab&amp;gt;Henggang Cui, Jinliang Wei, Wei Dai. Parallel Implementation of Expectation-Maximization for Fast Convergence - School of Computer Science, Carnegie Mellon University. [https://users.ece.cmu.edu/~hengganc/archive/report/final.pdf]&amp;lt;/ref&amp;gt;. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм&amp;lt;ref&amp;gt;Вячеслав Орешков. EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, а суммарная сложность шага E и сложность всей итерации составит &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Макроструктура алгоритма представлена на рисунке 1 (см. [[#Макроструктура алгоритма|раздел 1.4]] статьи).&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 представлена схема вычислений E-шага алгоритма для одного объекта: для объекта &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и параметров &amp;lt;math&amp;gt;w_{j}, \mu_{j}, \Sigma_{j}, j=1..k&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются ненормированные значения скрытых переменных &amp;lt;math&amp;gt;g_{j}&amp;lt;/math&amp;gt;, нормировочный коэффициент &#039;&#039;normСoeff&#039;&#039;, и получаются итоговые значения &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step.png|thumb|center|400px|Рисунок 2: E-шаг EM алгоритма для одного объекта]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 представлена схема вычислений E-шага алгоритма для всех объектов: для объекта &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt; и параметров-векторов &amp;lt;math&amp;gt;w, \mu, \Sigma&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются значения скрытых переменных. &amp;lt;math&amp;gt;E_{i}, i=1..n&amp;lt;/math&amp;gt; - маркооперации, E-шаги для соответствующих объектов.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step_all.png|thumb|center|400px|Рисунок 3: E-шаг EM алгоритма для всех объектов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена схема вычислений M-шага алгоритма для одного кластера: для объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и скрытых переменных &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;, соответствующих степени принадлежности этих объектов кластеру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, согласно формулам шага M [[#Математическое описание алгоритма|раздела 1.2]] вычисляется нормировочный коэффициент &amp;lt;math&amp;gt;N_{j}&amp;lt;/math&amp;gt; и параметры этого кластера: вес &amp;lt;math&amp;gt;w_{j}^{new}&amp;lt;/math&amp;gt;, матрица ковариации &amp;lt;math&amp;gt;\Sigma_{j}^{new}&amp;lt;/math&amp;gt; и центр кластера &amp;lt;math&amp;gt;\mu_{j}^{new}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step.png|thumb|center|400px|Рисунок 4: M-шаг EM алгоритма для одного кластера]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена схема вычислений M-шага алгоритма для всех кластеров. &amp;lt;math&amp;gt;M_{j}, j=1..k&amp;lt;/math&amp;gt; соответствует макрооперации - M-шагу для соответствующего кластера и скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step_all.png|thumb|center|400px|Рисунок 5: M-шаг EM алгоритма для всех кластеров]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Из схем вычислений шагов E и M шагов алгоритма, приведенным в [[#Информационный граф|предыдущем разделе]], видно, что если размерность матрицы ковариации небольшая (тогда вычисление определителя и обратной матрицы матрице ковариации не является трудоемкой операцией), обе макрооперации EM алгоритма можно распараллеливать как по кластерам, так и по объектам.&lt;br /&gt;
&lt;br /&gt;
Как правило количество кластеров, на которые нужно разбить объекты, несравнимо меньше количества объектов, поэтому распараллеливание в большинстве существующих реализаций происходит по объектам: обработка объектов по возможности равномерно распределяются по кластерам. Теоретически (если считать передачу данных между процессорами мгновенной) при наличии неограниченного числа процессоров сложность алгоритма составит &amp;lt;math&amp;gt;O(m^2 * k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* Целое неотрицательное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
* Значения координат объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; объектов с &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; координатами каждый.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;n * m&amp;lt;/math&amp;gt; вещественных чисел (если координаты объектов - вещественные числа), &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целое неотрицательное число.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - для каждого объекта указан номер кластера, к которому он отнесен.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; целых неотрицательных чисел. &lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
=== Преимущества и недостатки ===&lt;br /&gt;
EM-алгоритм обладает следующими преимуществами и недостатками&amp;lt;ref&amp;gt;EM алгоритм, его модификации и обобщения. machinelearning.ru [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]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Преимущества:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Слабо чувствителен к выбросам&lt;br /&gt;
# Прост в реализации&lt;br /&gt;
# Быстро сходится при удачном выборе начальных значений параметров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Неустойчив к выбору начальных значений параметров - от них зависит как скорость сходимости, так и результат работы: алгоритм может сойтись к локальному экстремуму функции правдоподобия, который может быть существенно ниже глобального.&lt;br /&gt;
# Алгоритм не находит оптимальное количество кластеров. Количество кластеров, на которые нужно разбить множество объектов, является параметром алгоритма.&lt;br /&gt;
# При большой размерности пространства объектов выдвинутое предположение о модели их распределения может быть некорректным.&lt;br /&gt;
&lt;br /&gt;
=== Влияние структуры матрицы ковариации на форму кластера ===&lt;br /&gt;
&lt;br /&gt;
[[file:DifferentCovariance.png|thumb|center|800px|Рисунок 6: Влияние структуры матрицы ковариации на форму кластеров для двумерного случая. a) - матрицы ковариации являются диагональными, b) - матрицы ковариации произвольны. &amp;lt;ref&amp;gt;Mathworks: Clustering Using Gaussian Mixture Models [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 6 наглядно показывает, что при диагональной форме матриц ковариации полуоси эллипса (в общем случае - эллипсоида), соответствующего распределению объектов, отнесенных кластеру, параллельны осям координат объектов. В противном случае полуоси могут располагаться произвольным образом.&lt;br /&gt;
&lt;br /&gt;
=== Общие свойства ===&lt;br /&gt;
[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] EM алгоритма равна &amp;lt;math&amp;gt;m * k * it&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - размерность объекта, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров, а &amp;lt;math&amp;gt;it&amp;lt;/math&amp;gt; - количество итераций. &lt;br /&gt;
&lt;br /&gt;
EM-алгоритм является итерационным, и число итераций в общем случае не фиксировано: оно зависит от условий остановки, начальных приближений и расположения объектов. Поэтому этот алгоритм &#039;&#039;недетерминированный&#039;&#039;. По тем же причинам EM-алгоритм является &#039;&#039;неустойчивым&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
=== Инициализация параметров распределений ===&lt;br /&gt;
Наиболее распространены 3 способа инициализации центров распределений для EM алгоритма:&lt;br /&gt;
# центр распределения совпадает со случайно выбранным объектом &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
# все наблюдения распределяются по кластерам случайным образом, а затем для каждого кластера пересчитывается цент соответствующего распределения&lt;br /&gt;
# центры кластеров получаются в результате работы алгоритма k-means. Использование такой инициализации оправдано тем, что k-means требует меньших вычислительных затрат и быстрее сходится&amp;lt;ref&amp;gt;EM алгоритм (пример) machinelearning.ru [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])&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Многие статьи&amp;lt;ref name=FREERIDE&amp;gt;Leonid Glimcher, Gagan Agrawal. Parallelising EM Algorithm on a Cluster of SMPs [http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CV&amp;gt;López-de-Teruel P. E., García J. M., Acacio; The Parallel EM Algorithm and its Applications in Computer Vision [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=MULTITHREAD&amp;gt;Sharon X. Lee, Kaleb L. Leemaqz, Geoffrey J. McLachlan. A simple multithreaded implementation of the EM algorithm for mixture models [https://arxiv.org/pdf/1606.02054.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CUDA&amp;gt;Araújo, G.F., H.T. Macedo, M.T. Chella, C.A.E. Montesco and M.V.O. Medeiros. PARALLEL IMPLEMENTATION OF EXPECTATION-MAXIMISATION ALGORITHM FOR THE TRAINING OF GAUSSIAN MIXTURE MODELS [https://ri.ufs.br/bitstream/123456789/1764/1/ExpectationMaximisationAlgorithm.pdf]&amp;lt;/ref&amp;gt;, в которых представлены параллельные реализации EM алгоритма, описывают помимо использующихся программных и аппаратных решений результаты проведенных экспериментов с данными. В качестве примера в этом разделе будут рассмотрены результаты эксперементов, проведенных со связующим программным обеспечением (&#039;&#039;middleware&#039;&#039;) FREERIDE&amp;lt;ref&amp;gt;Leonid Glimchera, Ruoming Jinb, Gagan Agrawala. Middleware for data mining applications on clusters and grids [http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf]&amp;lt;/ref&amp;gt; (FRamework for Rapid Implementation of Datamining Engines), обеспечивающим возможность распараллеливания как для систем с общей памятью (в частности, симметричных мультипроцессорных систем), так и для систем с распределенной памятью.&lt;br /&gt;
&lt;br /&gt;
Эксперименты проводились на кластере машин Pentium 700MHz связанных при помощи Myrinet&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Myrinet&amp;lt;/ref&amp;gt; LANai 7.0 на трех наборах данных: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;а)&#039;&#039;&#039; 3.3 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; 6.2 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; 12.5 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
Объекты представляют собой координаты точек 10-мерного пространства.&lt;br /&gt;
 &lt;br /&gt;
Количество машин в кластере варьировалось от 1 до 8, при этом на каждой машине запускалось до четырех параллельных потоков.&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов представлены на рисунках 7-9&amp;lt;ref name=FREERIDE/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_a.png|thumb|center|350px|Рисунок 7: набор данных a)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_b.png|thumb|center|357px|Рисунок 8: набор данных b)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_c.png|thumb|center|351px|Рисунок 9: набор данных c)]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что используемые в данном исследовании машины, как и коммуникационная среда, сейчас не используются и считаются устаревшими, результат приведенных экспериментов наглядно показывает, что EM алгоритм хорошо параллелится, зависимость ускорения от числа узлов в кластере с небольшим количеством узлов близка к линейной, а также, что скорость работы алгоритма линейно зависит от числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Данный раздел может быть дополнен&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Примеры библиотек, содержащих последовательную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV(C++)] ([https://github.com/opencv/opencv/blob/master/modules/ml/src/em.cpp github])&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab]&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html Scikit learn (Python)]&lt;br /&gt;
# [http://mlpack.org/index.html MLPack(C++)]&lt;br /&gt;
&lt;br /&gt;
Примеры библиотек, содержащих параллельную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Здесь приводятся как конкретные реализации, так и статьи, описывающие подходы к реализациям распараллеливания EM-алгоритма&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# [https://spark.apache.org/ Apache Spark]&lt;br /&gt;
# [http://accord-framework.net/ Accord.NET Framework (C#)]&lt;br /&gt;
# Статья об использовании FREERIDE middleware для распараллеливания EM алгоритма &amp;lt;ref name=FREERIDE/&amp;gt; &lt;br /&gt;
# [http://andrewharp.com/gmmcuda реализация с использованием CUDA]&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MPI еще одна реализация с использованием CUDA]&lt;br /&gt;
# статья об использовании параллельного EM алгоритма в задачах компьютерного зрения &amp;lt;ref name=CV/&amp;gt;&lt;br /&gt;
# статья о распараллеливании EM алгоритма с использованием CUDA &amp;lt;ref name=CUDA/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Noite</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:Noite/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=16878</id>
		<title>Участник:Noite/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:Noite/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=16878"/>
		<updated>2016-11-14T09:58:55Z</updated>

		<summary type="html">&lt;p&gt;Noite: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(N * M^2 * K)&amp;lt;/math&amp;gt; - одна итерация&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;N * M + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Noite|Зинченко Д.А.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
В задачах оптимизации EM-алгоритмом называют итеративную процедуру поиска численного значения экстремума какой-либо функции. В частности, в статистике этот алгоритм используется для оценки максимального правдоподобия. Впервые название EM-алгоритм было предложено в 1977 году&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;, однако его идеи были описаны и раньше&amp;lt;ref name=korolev&amp;gt;В.Ю.Королёв. ЕМ-алгоритм, его модификации и их применение к задаче разделения смесей вероятностных распределений.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм применяется для решения задач двух типов &amp;lt;ref name=korolev/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Анализ неполных данных (данных с пропусками). &lt;br /&gt;
# Оценка максимального правдоподобия в случае, если функцию правдоподобия трудно исследовать аналитически. В этом случае введение набора скрытых переменных может существенно упростить задачу.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к задачам второго типа. В данной статье рассматривается следующая постановка задачи кластеризации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;Дано множество объектов, каждый из которых представляет собой точку в n-мерном метрическом пространстве. Каждому измерению пространства соответствует некоторое свойство объекта. Необходимо разбить это множество на k подмножеств так, чтобы, чтобы элементы каждого подмножества существенно отличались по свойствам от элементов других подмножеств.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование алгоритма EM подразумевает следующее &#039;&#039;предположение об объектах&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Пусть объекты, которые необходимо разбить на кластеры, появляются случайным образом и независимо друг от друга согласно вероятностному распределению, равному смеси (линейной комбинации) распределений кластеров. В данной статье в дальнейшем будет считаться, что распределение каждого кластера является многомерным нормальным распределением с произвольной матрицей ковариации - наиболее часто используемое предположение.&lt;br /&gt;
&lt;br /&gt;
Тогда каждый объект принадлежит каждому кластеру, но с разной вероятностью. EM-алгоритм итеративно оценивает параметры распределений кластеров, максимизируя логарифмическую функцию максимального правдоподобия. После окончания работы алгоритма объект будет отнесен к кластеру, вероятность принадлежности которому максимальна. Вводимый набор скрытых переменных для каждого объекта - вероятности того, что объект принадлежит каждому из кластеров.&lt;br /&gt;
&lt;br /&gt;
Итерация алгоритма состоит из двух последовательных шагов.&lt;br /&gt;
&lt;br /&gt;
# (Expectation) Вычисляются новые ожидаемые значения скрытых переменных.&lt;br /&gt;
# (Maximization) Решается задача максимизации правдоподобия: По текущим значениям скрытых переменных обновляются параметры распределений для кластеров: математическое ожидание, дисперсия и вероятность появления объектов из кластера.&lt;br /&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;N&amp;lt;/math&amp;gt; - количество объектов, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - количество параметров объекта&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\gamma_{n,k}&amp;lt;/math&amp;gt; - значения скрытых переменных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N_{k}&amp;lt;/math&amp;gt; - количество элементов отнесенных к соответствующему кластеру&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{1},...,x_n&amp;lt;/math&amp;gt; - объекты&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Параметры распределений:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{1},...,w_{k}&amp;lt;/math&amp;gt; - вероятности появления объектов из кластеров (веса кластеров), &amp;lt;math&amp;gt;\sum_{k=1}^Kw_{k}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{1},...,\mu_{k}&amp;lt;/math&amp;gt; - центры гауссиан кластеров&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma_{1},...,\Sigma_{k}&amp;lt;/math&amp;gt; - матрицы ковариации гауссиан кластеров, каждая матрица имеет размерность &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Смесь распределений:&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; P(x) = \sum_{j=1}^Kw_jp(x|\mu_{j}, \Sigma_{j})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Цель алгоритма - вычислить параметры распределений, максимизирующих логарифм функции правдоподобия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\ln P(x|w,\mu,\Sigma)= \sum_{n=1}^N \ln \{ \sum_{k=1}^K w_{k}p(x_{n}|\mu_{k},\Sigma_{k})\}&amp;lt;/math&amp;gt;.&amp;lt;/center&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
* В начале работы алгоритма задаются параметры начального приближения:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{i} = 1/K, \mu_{i} = random(x_{j}), i=1..K, j=1..N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{j,j}^{k}=\frac{1}{NK}\sum_{i=1}^N(x_{i,j} - \mu_{k,j})^2, k=1..K, j=1..M&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Поскольку от начального приближения может сильно зависеть результат работы алгоритма, вместо инициализации кластеров случайными центрами, равными весами и диагональными матрицами ковариации, как в приведенных формулах, часто применяют другие способы (подробнее - в [[#Особенности реализации последовательного алгоритма | особенностях реализации]])&#039;&#039;&lt;br /&gt;
* Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
** E-шаг: используя текущее значение параметров &amp;lt;math&amp;gt;w_{1},...,w_{k};\mu_{1},...,\mu_{k};\Sigma^{1},...,\Sigma^{k}&amp;lt;/math&amp;gt;, вычисляем значение вектора скрытых переменных &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\gamma_{n,k}=\frac{w_{k}p(x_{n}|\mu_{k},\Sigma^{k})}{\sum_{j=1}^K w_{j}p(x_{n}|\mu_{j},\Sigma^{j})}, &amp;lt;/math&amp;gt; знаменатель дроби - нормировочный коэффициент&amp;lt;/center&amp;gt;&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p(x|\mu,\Sigma)=\frac{1}{{(2\pi)}^{\frac{N}{2}}\sqrt{|\Sigma|}}exp\biggl\{-\frac{1}{2}{(x-\mu)}^T{\Sigma}^{-1}(x-\mu)\biggr\}&amp;lt;/math&amp;gt; - плотность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерного нормального распределения&amp;lt;/center&amp;gt;&lt;br /&gt;
** М-шаг: переоценка параметров по текущим значениям скрытых переменных для &amp;lt;math&amp;gt;k = 1..K&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\mu^{new}_{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k}x_{n}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{new}^{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k} (x_{n}-\mu_{k}^{new})(x_{n}-\mu_{k}^{new})^{T}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{k}^{new}=\frac{N_{k}}{N}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;N_{k}=\sum_{n=1}^N \gamma_{n,k}&amp;lt;/math&amp;gt;.&amp;lt;/center&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;
Вычислительное ядро алгоритма состоит из двух шагов, повторяющихся каждую итерацию:&lt;br /&gt;
*Обновление скрытых переменных на основе текущих параметров распределений&lt;br /&gt;
*Обновление параметров кластеров: весов, центров и матриц ковариации&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании вычислительного ядра алгоритма]], основную часть алгоритма составляют итеративно проводимые макрооперации: Expectation шаг - вычисление новых значений скрытых переменных, Maximization шаг - обновление параметров кластеров. Макроструктура алгоритма представлена на рисунке 1:&lt;br /&gt;
[[file:EM_macro.png|thumb|center|600px|Рисунок 1: Макроструктура EM-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Примерная схема реализации EM алгоритма с предварительной обработкой матриц ковариации:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
// n - количество объектов&lt;br /&gt;
&lt;br /&gt;
// m - количество координат объектов&lt;br /&gt;
&lt;br /&gt;
// k - количество кластеров&lt;br /&gt;
&lt;br /&gt;
Инициализировать веса и центры кластеров;&lt;br /&gt;
Инициализировать матрицы ковариации;&lt;br /&gt;
&lt;br /&gt;
// Основной цикл&lt;br /&gt;
Пока условие остановки не выполнено&lt;br /&gt;
    // E-шаг&lt;br /&gt;
    В цикле для каждого кластера&lt;br /&gt;
        Вычислить определитель матрицы ковариации Sigma;&lt;br /&gt;
        Вычислить обратную матрицу матрице Sigma;&lt;br /&gt;
    В цикле для каждого объекта&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Вычислить и запомнить p(x | mu, Sigma) для текущего объекта и кластера;&lt;br /&gt;
            Просуммировать вычисленные p(x | mu, Sigma);&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Обновить скрытые переменные gamma;&lt;br /&gt;
    // M-шаг&lt;br /&gt;
    Обновить веса w;&lt;br /&gt;
    Обновить центры кластеров mu;&lt;br /&gt;
    Обновить матрицы ковариации Sigma;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления определителя произвольной матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления матрицы, обратной произвольной матрице ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации - &amp;lt;math&amp;gt;O(k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С учетом заранее вычисленных определителей и обратных матриц сложность вычисления &amp;lt;math&amp;gt;p(x | \mu,\Sigma)&amp;lt;/math&amp;gt; составит: &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага E составит &amp;lt;math&amp;gt;O(n * m^2 * k + k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления весов кластеров &amp;lt;math&amp;gt;O(k * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления центров кластеров &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления одной матрицы ковариации &amp;lt;math&amp;gt;O(n * m)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления всех матриц ковариации &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага M алгоритма - &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит &amp;lt;math&amp;gt;O(k * m^2 * n + k * m^3 + k * m * n)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В предположении, что размерность объектов много меньше их количества &amp;lt;math&amp;gt;m &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt; получим сложность итерации &amp;lt;math&amp;gt;O(k * m^2 * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большУю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее - вынесены за основной цикл шага E&amp;lt;ref name=ParallelEMComparissonGraphLab&amp;gt;Henggang Cui, Jinliang Wei, Wei Dai. Parallel Implementation of Expectation-Maximization for Fast Convergence - School of Computer Science, Carnegie Mellon University. [https://users.ece.cmu.edu/~hengganc/archive/report/final.pdf]&amp;lt;/ref&amp;gt;. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм&amp;lt;ref&amp;gt;Вячеслав Орешков. EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, а суммарная сложность шага E и сложность всей итерации составит &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Макроструктура алгоритма представлена на рисунке 1 (см. [[#Макроструктура алгоритма|раздел 1.4]] статьи).&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 представлена схема вычислений E-шага алгоритма для одного объекта: для объекта &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и параметров &amp;lt;math&amp;gt;w_{j}, \mu_{j}, \Sigma_{j}, j=1..k&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются ненормированные значения скрытых переменных &amp;lt;math&amp;gt;g_{j}&amp;lt;/math&amp;gt;, нормировочный коэффициент &#039;&#039;normСoeff&#039;&#039;, и получаются итоговые значения &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step.png|thumb|center|400px|Рисунок 2: E-шаг EM алгоритма для одного объекта]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 представлена схема вычислений E-шага алгоритма для всех объектов: для объекта &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt; и параметров-векторов &amp;lt;math&amp;gt;w, \mu, \Sigma&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются значения скрытых переменных. &amp;lt;math&amp;gt;E_{i}, i=1..n&amp;lt;/math&amp;gt; - маркооперации, E-шаги для соответствующих объектов.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step_all.png|thumb|center|400px|Рисунок 3: E-шаг EM алгоритма для всех объектов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена схема вычислений M-шага алгоритма для одного кластера: для объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и скрытых переменных &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;, соответствующих степени принадлежности этих объектов кластеру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, согласно формулам шага M [[#Математическое описание алгоритма|раздела 1.2]] вычисляется нормировочный коэффициент &amp;lt;math&amp;gt;N_{j}&amp;lt;/math&amp;gt; и параметры этого кластера: вес &amp;lt;math&amp;gt;w_{j}^{new}&amp;lt;/math&amp;gt;, матрица ковариации &amp;lt;math&amp;gt;\Sigma_{j}^{new}&amp;lt;/math&amp;gt; и центр кластера &amp;lt;math&amp;gt;\mu_{j}^{new}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step.png|thumb|center|400px|Рисунок 4: M-шаг EM алгоритма для одного кластера]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена схема вычислений M-шага алгоритма для всех кластеров. &amp;lt;math&amp;gt;M_{j}, j=1..k&amp;lt;/math&amp;gt; соответствует макрооперации - M-шагу для соответствующего кластера и скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step_all.png|thumb|center|400px|Рисунок 5: M-шаг EM алгоритма для всех кластеров]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Из схем вычислений шагов E и M шагов алгоритма, приведенным в [[#Информационный граф|предыдущем разделе]], видно, что если размерность матрицы ковариации небольшая (тогда вычисление определителя и обратной матрицы матрице ковариации не является трудоемкой операцией), обе макрооперации EM алгоритма можно распараллеливать как по кластерам, так и по объектам.&lt;br /&gt;
&lt;br /&gt;
Как правило количество кластеров, на которые нужно разбить объекты, несравнимо меньше количества объектов, поэтому распараллеливание в большинстве существующих реализаций происходит по объектам: обработка объектов по возможности равномерно распределяются по кластерам. Теоретически (если считать передачу данных между процессорами мгновенной) при наличии неограниченного числа процессоров сложность алгоритма составит &amp;lt;math&amp;gt;O(m^2 * k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* Целое неотрицательное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
* Значения координат объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; объектов с &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; координатами каждый.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;n * m&amp;lt;/math&amp;gt; вещественных чисел (если координаты объектов - вещественные числа), &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целое неотрицательное число.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - для каждого объекта указан номер кластера, к которому он отнесен.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; целых неотрицательных чисел. &lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
=== Преимущества и недостатки ===&lt;br /&gt;
EM-алгоритм обладает следующими преимуществами и недостатками&amp;lt;ref&amp;gt;EM алгоритм, его модификации и обобщения. machinelearning.ru [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]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Преимущества:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Слабо чувствителен к выбросам&lt;br /&gt;
# Прост в реализации&lt;br /&gt;
# Быстро сходится при удачном выборе начальных значений параметров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Неустойчив к выбору начальных значений параметров - от них зависит как скорость сходимости, так и результат работы: алгоритм может сойтись к локальному экстремуму функции правдоподобия, который может быть существенно ниже глобального.&lt;br /&gt;
# Алгоритм не находит оптимальное количество кластеров. Количество кластеров, на которые нужно разбить множество объектов, является параметром алгоритма.&lt;br /&gt;
# При большой размерности пространства объектов выдвинутое предположение о модели их распределения может быть некорректным.&lt;br /&gt;
&lt;br /&gt;
=== Влияние структуры матрицы ковариации на форму кластера ===&lt;br /&gt;
&lt;br /&gt;
[[file:DifferentCovariance.png|thumb|center|800px|Рисунок 6: Влияние структуры матрицы ковариации на форму кластеров для двумерного случая. a) - матрицы ковариации являются диагональными, b) - матрицы ковариации произвольны. &amp;lt;ref&amp;gt;Mathworks: Clustering Using Gaussian Mixture Models [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 6 наглядно показывает, что при диагональной форме матриц ковариации полуоси эллипса (в общем случае - эллипсоида), соответствующего распределению объектов, отнесенных кластеру, параллельны осям координат объектов. В противном случае полуоси могут располагаться произвольным образом.&lt;br /&gt;
&lt;br /&gt;
=== Общие свойства ===&lt;br /&gt;
[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] EM алгоритма равна &amp;lt;math&amp;gt;m * k * it&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - размерность объекта, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров, а &amp;lt;math&amp;gt;it&amp;lt;/math&amp;gt; - количество итераций. &lt;br /&gt;
&lt;br /&gt;
EM-алгоритм является итерационным, и число итераций в общем случае не фиксировано: оно зависит от условий остановки, начальных приближений и расположения объектов. Поэтому этот алгоритм &#039;&#039;недетерминированный&#039;&#039;. По тем же причинам EM-алгоритм является &#039;&#039;неустойчивым&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
=== Инициализация параметров распределений ===&lt;br /&gt;
Наиболее распространены 3 способа инициализации центров распределений для EM алгоритма:&lt;br /&gt;
# центр распределения совпадает со случайно выбранным объектом &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
# все наблюдения распределяются по кластерам случайным образом, а затем для каждого кластера пересчитывается цент соответствующего распределения&lt;br /&gt;
# центры кластеров получаются в результате работы алгоритма k-means. Использование такой инициализации оправдано тем, что k-means требует меньших вычислительных затрат и быстрее сходится&amp;lt;ref&amp;gt;EM алгоритм (пример) machinelearning.ru [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])&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Многие статьи&amp;lt;ref name=FREERIDE&amp;gt;Leonid Glimcher, Gagan Agrawal. Parallelising EM Algorithm on a Cluster of SMPs [http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CV&amp;gt;López-de-Teruel P. E., García J. M., Acacio; The Parallel EM Algorithm and its Applications in Computer Vision [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=MULTITHREAD&amp;gt;Sharon X. Lee, Kaleb L. Leemaqz, Geoffrey J. McLachlan. A simple multithreaded implementation of the EM algorithm for mixture models [https://arxiv.org/pdf/1606.02054.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CUDA&amp;gt;Araújo, G.F., H.T. Macedo, M.T. Chella, C.A.E. Montesco and M.V.O. Medeiros. PARALLEL IMPLEMENTATION OF EXPECTATION-MAXIMISATION ALGORITHM FOR THE TRAINING OF GAUSSIAN MIXTURE MODELS [https://ri.ufs.br/bitstream/123456789/1764/1/ExpectationMaximisationAlgorithm.pdf]&amp;lt;/ref&amp;gt;, в которых представлены параллельные реализации EM алгоритма, описывают помимо использующихся программных и аппаратных решений результаты проведенных экспериментов с данными. В качестве примера в этом разделе будут рассмотрены результаты эксперементов, проведенных со связующим программным обеспечением (&#039;&#039;middleware&#039;&#039;) FREERIDE&amp;lt;ref&amp;gt;Leonid Glimchera, Ruoming Jinb, Gagan Agrawala. Middleware for data mining applications on clusters and grids [http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf]&amp;lt;/ref&amp;gt; (FRamework for Rapid Implementation of Datamining Engines), обеспечивающим возможность распараллеливания как для систем с общей памятью (в частности, симметричных мультипроцессорных систем), так и для систем с распределенной памятью.&lt;br /&gt;
&lt;br /&gt;
Эксперименты проводились на кластере машин Pentium 700MHz связанных при помощи Myrinet&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Myrinet&amp;lt;/ref&amp;gt; LANai 7.0 на трех наборах данных: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;а)&#039;&#039;&#039; 3.3 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; 6.2 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; 12.5 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
Объекты представляют собой координаты точек 10-мерного пространства.&lt;br /&gt;
 &lt;br /&gt;
Количество машин в кластере варьировалось от 1 до 8, при этом на каждой машине запускалось до четырех параллельных потоков.&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов представлены на рисунках 7-9&amp;lt;ref name=FREERIDE/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_a.png|thumb|center|350px|Рисунок 7: набор данных a)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_b.png|thumb|center|357px|Рисунок 8: набор данных b)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_c.png|thumb|center|351px|Рисунок 9: набор данных c)]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что используемые в данном исследовании машины, как и коммуникационная среда, сейчас не используются и считаются устаревшими, результат приведенных экспериментов наглядно показывает, что EM алгоритм хорошо параллелится, зависимость ускорения от числа узлов в кластере с небольшим количеством узлов близка к линейной, а также, что скорость работы алгоритма линейно зависит от числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Данный раздел может быть дополнен&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Примеры библиотек, содержащих последовательную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV(C++)] ([https://github.com/opencv/opencv/blob/master/modules/ml/src/em.cpp github])&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab]&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html Scikit learn (Python)]&lt;br /&gt;
# [http://mlpack.org/index.html MLPack(C++)]&lt;br /&gt;
&lt;br /&gt;
Примеры библиотек, содержащих параллельную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Здесь приводятся как конкретные реализации, так и статьи, описывающие подходы к реализациям распараллеливания EM-алгоритма&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# [https://spark.apache.org/ Apache Spark]&lt;br /&gt;
# [http://accord-framework.net/ Accord.NET Framework (C#)]&lt;br /&gt;
# Статья об использовании FREERIDE middleware для распараллеливания EM алгоритма &amp;lt;ref name=FREERIDE/&amp;gt; &lt;br /&gt;
# [http://andrewharp.com/gmmcuda реализация с использованием CUDA]&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MPI еще одна реализация с использованием CUDA]&lt;br /&gt;
# статья об использовании параллельного EM алгоритма в задачах компьютерного зрения &amp;lt;ref name=CV/&amp;gt;&lt;br /&gt;
# статья о распараллеливании EM алгоритма с использованием CUDA &amp;lt;ref name=CUDA/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Noite</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:Noite/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=16877</id>
		<title>Участник:Noite/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:Noite/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=16877"/>
		<updated>2016-11-14T09:56:51Z</updated>

		<summary type="html">&lt;p&gt;Noite: /* Преимущества и недостаткиEM алгоритм, его модификации и обобщения. machinelearning.ru [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] */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n * m^2 * k)&amp;lt;/math&amp;gt; - одна итерация&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n * m + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Noite|Зинченко Д.А.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
В задачах оптимизации EM-алгоритмом называют итеративную процедуру поиска численного значения экстремума какой-либо функции. В частности, в статистике этот алгоритм используется для оценки максимального правдоподобия. Впервые название EM-алгоритм было предложено в 1977 году&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;, однако его идеи были описаны и раньше&amp;lt;ref name=korolev&amp;gt;В.Ю.Королёв. ЕМ-алгоритм, его модификации и их применение к задаче разделения смесей вероятностных распределений.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм применяется для решения задач двух типов &amp;lt;ref name=korolev/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Анализ неполных данных (данных с пропусками). &lt;br /&gt;
# Оценка максимального правдоподобия в случае, если функцию правдоподобия трудно исследовать аналитически. В этом случае введение набора скрытых переменных может существенно упростить задачу.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к задачам второго типа. В данной статье рассматривается следующая постановка задачи кластеризации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;Дано множество объектов, каждый из которых представляет собой точку в n-мерном метрическом пространстве. Каждому измерению пространства соответствует некоторое свойство объекта. Необходимо разбить это множество на k подмножеств так, чтобы, чтобы элементы каждого подмножества существенно отличались по свойствам от элементов других подмножеств.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование алгоритма EM подразумевает следующее &#039;&#039;предположение об объектах&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Пусть объекты, которые необходимо разбить на кластеры, появляются случайным образом и независимо друг от друга согласно вероятностному распределению, равному смеси (линейной комбинации) распределений кластеров. В данной статье в дальнейшем будет считаться, что распределение каждого кластера является многомерным нормальным распределением с произвольной матрицей ковариации - наиболее часто используемое предположение.&lt;br /&gt;
&lt;br /&gt;
Тогда каждый объект принадлежит каждому кластеру, но с разной вероятностью. EM-алгоритм итеративно оценивает параметры распределений кластеров, максимизируя логарифмическую функцию максимального правдоподобия. После окончания работы алгоритма объект будет отнесен к кластеру, вероятность принадлежности которому максимальна. Вводимый набор скрытых переменных для каждого объекта - вероятности того, что объект принадлежит каждому из кластеров.&lt;br /&gt;
&lt;br /&gt;
Итерация алгоритма состоит из двух последовательных шагов.&lt;br /&gt;
&lt;br /&gt;
# (Expectation) Вычисляются новые ожидаемые значения скрытых переменных.&lt;br /&gt;
# (Maximization) Решается задача максимизации правдоподобия: По текущим значениям скрытых переменных обновляются параметры распределений для кластеров: математическое ожидание, дисперсия и вероятность появления объектов из кластера.&lt;br /&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;N&amp;lt;/math&amp;gt; - количество объектов, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - количество параметров объекта&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\gamma_{n,k}&amp;lt;/math&amp;gt; - значения скрытых переменных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N_{k}&amp;lt;/math&amp;gt; - количество элементов отнесенных к соответствующему кластеру&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{1},...,x_n&amp;lt;/math&amp;gt; - объекты&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Параметры распределений:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{1},...,w_{k}&amp;lt;/math&amp;gt; - вероятности появления объектов из кластеров (веса кластеров), &amp;lt;math&amp;gt;\sum_{k=1}^Kw_{k}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{1},...,\mu_{k}&amp;lt;/math&amp;gt; - центры гауссиан кластеров&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma_{1},...,\Sigma_{k}&amp;lt;/math&amp;gt; - матрицы ковариации гауссиан кластеров, каждая матрица имеет размерность &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Смесь распределений:&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; P(x) = \sum_{j=1}^Kw_jp(x|\mu_{j}, \Sigma_{j})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Цель алгоритма - вычислить параметры распределений, максимизирующих логарифм функции правдоподобия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\ln P(x|w,\mu,\Sigma)= \sum_{n=1}^N \ln \{ \sum_{k=1}^K w_{k}p(x_{n}|\mu_{k},\Sigma_{k})\}&amp;lt;/math&amp;gt;.&amp;lt;/center&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
* В начале работы алгоритма задаются параметры начального приближения:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{i} = 1/K, \mu_{i} = random(x_{j}), i=1..K, j=1..N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{j,j}^{k}=\frac{1}{NK}\sum_{i=1}^N(x_{i,j} - \mu_{k,j})^2, k=1..K, j=1..M&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Поскольку от начального приближения может сильно зависеть результат работы алгоритма, вместо инициализации кластеров случайными центрами, равными весами и диагональными матрицами ковариации, как в приведенных формулах, часто применяют другие способы (подробнее - в [[#Особенности реализации последовательного алгоритма | особенностях реализации]])&#039;&#039;&lt;br /&gt;
* Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
** E-шаг: используя текущее значение параметров &amp;lt;math&amp;gt;w_{1},...,w_{k};\mu_{1},...,\mu_{k};\Sigma^{1},...,\Sigma^{k}&amp;lt;/math&amp;gt;, вычисляем значение вектора скрытых переменных &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\gamma_{n,k}=\frac{w_{k}p(x_{n}|\mu_{k},\Sigma^{k})}{\sum_{j=1}^K w_{j}p(x_{n}|\mu_{j},\Sigma^{j})}, &amp;lt;/math&amp;gt; знаменатель дроби - нормировочный коэффициент&amp;lt;/center&amp;gt;&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p(x|\mu,\Sigma)=\frac{1}{{(2\pi)}^{\frac{N}{2}}\sqrt{|\Sigma|}}exp\biggl\{-\frac{1}{2}{(x-\mu)}^T{\Sigma}^{-1}(x-\mu)\biggr\}&amp;lt;/math&amp;gt; - плотность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерного нормального распределения&amp;lt;/center&amp;gt;&lt;br /&gt;
** М-шаг: переоценка параметров по текущим значениям скрытых переменных для &amp;lt;math&amp;gt;k = 1..K&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\mu^{new}_{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k}x_{n}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{new}^{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k} (x_{n}-\mu_{k}^{new})(x_{n}-\mu_{k}^{new})^{T}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{k}^{new}=\frac{N_{k}}{N}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;N_{k}=\sum_{n=1}^N \gamma_{n,k}&amp;lt;/math&amp;gt;.&amp;lt;/center&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;
Вычислительное ядро алгоритма состоит из двух шагов, повторяющихся каждую итерацию:&lt;br /&gt;
*Обновление скрытых переменных на основе текущих параметров распределений&lt;br /&gt;
*Обновление параметров кластеров: весов, центров и матриц ковариации&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании вычислительного ядра алгоритма]], основную часть алгоритма составляют итеративно проводимые макрооперации: Expectation шаг - вычисление новых значений скрытых переменных, Maximization шаг - обновление параметров кластеров. Макроструктура алгоритма представлена на рисунке 1:&lt;br /&gt;
[[file:EM_macro.png|thumb|center|600px|Рисунок 1: Макроструктура EM-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Примерная схема реализации EM алгоритма с предварительной обработкой матриц ковариации:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
// n - количество объектов&lt;br /&gt;
&lt;br /&gt;
// m - количество координат объектов&lt;br /&gt;
&lt;br /&gt;
// k - количество кластеров&lt;br /&gt;
&lt;br /&gt;
Инициализировать веса и центры кластеров;&lt;br /&gt;
Инициализировать матрицы ковариации;&lt;br /&gt;
&lt;br /&gt;
// Основной цикл&lt;br /&gt;
Пока условие остановки не выполнено&lt;br /&gt;
    // E-шаг&lt;br /&gt;
    В цикле для каждого кластера&lt;br /&gt;
        Вычислить определитель матрицы ковариации Sigma;&lt;br /&gt;
        Вычислить обратную матрицу матрице Sigma;&lt;br /&gt;
    В цикле для каждого объекта&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Вычислить и запомнить p(x | mu, Sigma) для текущего объекта и кластера;&lt;br /&gt;
            Просуммировать вычисленные p(x | mu, Sigma);&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Обновить скрытые переменные gamma;&lt;br /&gt;
    // M-шаг&lt;br /&gt;
    Обновить веса w;&lt;br /&gt;
    Обновить центры кластеров mu;&lt;br /&gt;
    Обновить матрицы ковариации Sigma;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления определителя произвольной матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления матрицы, обратной произвольной матрице ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации - &amp;lt;math&amp;gt;O(k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С учетом заранее вычисленных определителей и обратных матриц сложность вычисления &amp;lt;math&amp;gt;p(x | \mu,\Sigma)&amp;lt;/math&amp;gt; составит: &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага E составит &amp;lt;math&amp;gt;O(n * m^2 * k + k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления весов кластеров &amp;lt;math&amp;gt;O(k * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления центров кластеров &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления одной матрицы ковариации &amp;lt;math&amp;gt;O(n * m)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления всех матриц ковариации &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага M алгоритма - &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит &amp;lt;math&amp;gt;O(k * m^2 * n + k * m^3 + k * m * n)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В предположении, что размерность объектов много меньше их количества &amp;lt;math&amp;gt;m &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt; получим сложность итерации &amp;lt;math&amp;gt;O(k * m^2 * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большУю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее - вынесены за основной цикл шага E&amp;lt;ref name=ParallelEMComparissonGraphLab&amp;gt;Henggang Cui, Jinliang Wei, Wei Dai. Parallel Implementation of Expectation-Maximization for Fast Convergence - School of Computer Science, Carnegie Mellon University. [https://users.ece.cmu.edu/~hengganc/archive/report/final.pdf]&amp;lt;/ref&amp;gt;. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм&amp;lt;ref&amp;gt;Вячеслав Орешков. EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, а суммарная сложность шага E и сложность всей итерации составит &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Макроструктура алгоритма представлена на рисунке 1 (см. [[#Макроструктура алгоритма|раздел 1.4]] статьи).&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 представлена схема вычислений E-шага алгоритма для одного объекта: для объекта &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и параметров &amp;lt;math&amp;gt;w_{j}, \mu_{j}, \Sigma_{j}, j=1..k&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются ненормированные значения скрытых переменных &amp;lt;math&amp;gt;g_{j}&amp;lt;/math&amp;gt;, нормировочный коэффициент &#039;&#039;normСoeff&#039;&#039;, и получаются итоговые значения &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step.png|thumb|center|400px|Рисунок 2: E-шаг EM алгоритма для одного объекта]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 представлена схема вычислений E-шага алгоритма для всех объектов: для объекта &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt; и параметров-векторов &amp;lt;math&amp;gt;w, \mu, \Sigma&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются значения скрытых переменных. &amp;lt;math&amp;gt;E_{i}, i=1..n&amp;lt;/math&amp;gt; - маркооперации, E-шаги для соответствующих объектов.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step_all.png|thumb|center|400px|Рисунок 3: E-шаг EM алгоритма для всех объектов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена схема вычислений M-шага алгоритма для одного кластера: для объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и скрытых переменных &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;, соответствующих степени принадлежности этих объектов кластеру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, согласно формулам шага M [[#Математическое описание алгоритма|раздела 1.2]] вычисляется нормировочный коэффициент &amp;lt;math&amp;gt;N_{j}&amp;lt;/math&amp;gt; и параметры этого кластера: вес &amp;lt;math&amp;gt;w_{j}^{new}&amp;lt;/math&amp;gt;, матрица ковариации &amp;lt;math&amp;gt;\Sigma_{j}^{new}&amp;lt;/math&amp;gt; и центр кластера &amp;lt;math&amp;gt;\mu_{j}^{new}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step.png|thumb|center|400px|Рисунок 4: M-шаг EM алгоритма для одного кластера]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена схема вычислений M-шага алгоритма для всех кластеров. &amp;lt;math&amp;gt;M_{j}, j=1..k&amp;lt;/math&amp;gt; соответствует макрооперации - M-шагу для соответствующего кластера и скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step_all.png|thumb|center|400px|Рисунок 5: M-шаг EM алгоритма для всех кластеров]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Из схем вычислений шагов E и M шагов алгоритма, приведенным в [[#Информационный граф|предыдущем разделе]], видно, что если размерность матрицы ковариации небольшая (тогда вычисление определителя и обратной матрицы матрице ковариации не является трудоемкой операцией), обе макрооперации EM алгоритма можно распараллеливать как по кластерам, так и по объектам.&lt;br /&gt;
&lt;br /&gt;
Как правило количество кластеров, на которые нужно разбить объекты, несравнимо меньше количества объектов, поэтому распараллеливание в большинстве существующих реализаций происходит по объектам: обработка объектов по возможности равномерно распределяются по кластерам. Теоретически (если считать передачу данных между процессорами мгновенной) при наличии неограниченного числа процессоров сложность алгоритма составит &amp;lt;math&amp;gt;O(m^2 * k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* Целое неотрицательное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
* Значения координат объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; объектов с &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; координатами каждый.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;n * m&amp;lt;/math&amp;gt; вещественных чисел (если координаты объектов - вещественные числа), &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целое неотрицательное число.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - для каждого объекта указан номер кластера, к которому он отнесен.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; целых неотрицательных чисел. &lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
=== Преимущества и недостатки ===&lt;br /&gt;
EM-алгоритм обладает следующими преимуществами и недостатками&amp;lt;ref&amp;gt;EM алгоритм, его модификации и обобщения. machinelearning.ru [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]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Преимущества:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Слабо чувствителен к выбросам&lt;br /&gt;
# Прост в реализации&lt;br /&gt;
# Быстро сходится при удачном выборе начальных значений параметров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Неустойчив к выбору начальных значений параметров - от них зависит как скорость сходимости, так и результат работы: алгоритм может сойтись к локальному экстремуму функции правдоподобия, который может быть существенно ниже глобального.&lt;br /&gt;
# Алгоритм не находит оптимальное количество кластеров. Количество кластеров, на которые нужно разбить множество объектов, является параметром алгоритма.&lt;br /&gt;
# При большой размерности пространства объектов выдвинутое предположение о модели их распределения может быть некорректным.&lt;br /&gt;
&lt;br /&gt;
=== Влияние структуры матрицы ковариации на форму кластера ===&lt;br /&gt;
&lt;br /&gt;
[[file:DifferentCovariance.png|thumb|center|800px|Рисунок 6: Влияние структуры матрицы ковариации на форму кластеров для двумерного случая. a) - матрицы ковариации являются диагональными, b) - матрицы ковариации произвольны. &amp;lt;ref&amp;gt;Mathworks: Clustering Using Gaussian Mixture Models [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 6 наглядно показывает, что при диагональной форме матриц ковариации полуоси эллипса (в общем случае - эллипсоида), соответствующего распределению объектов, отнесенных кластеру, параллельны осям координат объектов. В противном случае полуоси могут располагаться произвольным образом.&lt;br /&gt;
&lt;br /&gt;
=== Общие свойства ===&lt;br /&gt;
[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] EM алгоритма равна &amp;lt;math&amp;gt;m * k * it&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - размерность объекта, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров, а &amp;lt;math&amp;gt;it&amp;lt;/math&amp;gt; - количество итераций. &lt;br /&gt;
&lt;br /&gt;
EM-алгоритм является итерационным, и число итераций в общем случае не фиксировано: оно зависит от условий остановки, начальных приближений и расположения объектов. Поэтому этот алгоритм &#039;&#039;недетерминированный&#039;&#039;. По тем же причинам EM-алгоритм является &#039;&#039;неустойчивым&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
=== Инициализация параметров распределений ===&lt;br /&gt;
Наиболее распространены 3 способа инициализации центров распределений для EM алгоритма:&lt;br /&gt;
# центр распределения совпадает со случайно выбранным объектом &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
# все наблюдения распределяются по кластерам случайным образом, а затем для каждого кластера пересчитывается цент соответствующего распределения&lt;br /&gt;
# центры кластеров получаются в результате работы алгоритма k-means. Использование такой инициализации оправдано тем, что k-means требует меньших вычислительных затрат и быстрее сходится&amp;lt;ref&amp;gt;EM алгоритм (пример) machinelearning.ru [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])&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Многие статьи&amp;lt;ref name=FREERIDE&amp;gt;Leonid Glimcher, Gagan Agrawal. Parallelising EM Algorithm on a Cluster of SMPs [http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CV&amp;gt;López-de-Teruel P. E., García J. M., Acacio; The Parallel EM Algorithm and its Applications in Computer Vision [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=MULTITHREAD&amp;gt;Sharon X. Lee, Kaleb L. Leemaqz, Geoffrey J. McLachlan. A simple multithreaded implementation of the EM algorithm for mixture models [https://arxiv.org/pdf/1606.02054.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CUDA&amp;gt;Araújo, G.F., H.T. Macedo, M.T. Chella, C.A.E. Montesco and M.V.O. Medeiros. PARALLEL IMPLEMENTATION OF EXPECTATION-MAXIMISATION ALGORITHM FOR THE TRAINING OF GAUSSIAN MIXTURE MODELS [https://ri.ufs.br/bitstream/123456789/1764/1/ExpectationMaximisationAlgorithm.pdf]&amp;lt;/ref&amp;gt;, в которых представлены параллельные реализации EM алгоритма, описывают помимо использующихся программных и аппаратных решений результаты проведенных экспериментов с данными. В качестве примера в этом разделе будут рассмотрены результаты эксперементов, проведенных со связующим программным обеспечением (&#039;&#039;middleware&#039;&#039;) FREERIDE&amp;lt;ref&amp;gt;Leonid Glimchera, Ruoming Jinb, Gagan Agrawala. Middleware for data mining applications on clusters and grids [http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf]&amp;lt;/ref&amp;gt; (FRamework for Rapid Implementation of Datamining Engines), обеспечивающим возможность распараллеливания как для систем с общей памятью (в частности, симметричных мультипроцессорных систем), так и для систем с распределенной памятью.&lt;br /&gt;
&lt;br /&gt;
Эксперименты проводились на кластере машин Pentium 700MHz связанных при помощи Myrinet&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Myrinet&amp;lt;/ref&amp;gt; LANai 7.0 на трех наборах данных: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;а)&#039;&#039;&#039; 3.3 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; 6.2 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; 12.5 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
Объекты представляют собой координаты точек 10-мерного пространства.&lt;br /&gt;
 &lt;br /&gt;
Количество машин в кластере варьировалось от 1 до 8, при этом на каждой машине запускалось до четырех параллельных потоков.&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов представлены на рисунках 7-9&amp;lt;ref name=FREERIDE/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_a.png|thumb|center|350px|Рисунок 7: набор данных a)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_b.png|thumb|center|357px|Рисунок 8: набор данных b)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_c.png|thumb|center|351px|Рисунок 9: набор данных c)]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что используемые в данном исследовании машины, как и коммуникационная среда, сейчас не используются и считаются устаревшими, результат приведенных экспериментов наглядно показывает, что EM алгоритм хорошо параллелится, зависимость ускорения от числа узлов в кластере с небольшим количеством узлов близка к линейной, а также, что скорость работы алгоритма линейно зависит от числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Данный раздел может быть дополнен&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Примеры библиотек, содержащих последовательную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV(C++)] ([https://github.com/opencv/opencv/blob/master/modules/ml/src/em.cpp github])&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab]&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html Scikit learn (Python)]&lt;br /&gt;
# [http://mlpack.org/index.html MLPack(C++)]&lt;br /&gt;
&lt;br /&gt;
Примеры библиотек, содержащих параллельную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Здесь приводятся как конкретные реализации, так и статьи, описывающие подходы к реализациям распараллеливания EM-алгоритма&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# [https://spark.apache.org/ Apache Spark]&lt;br /&gt;
# [http://accord-framework.net/ Accord.NET Framework (C#)]&lt;br /&gt;
# Статья об использовании FREERIDE middleware для распараллеливания EM алгоритма &amp;lt;ref name=FREERIDE/&amp;gt; &lt;br /&gt;
# [http://andrewharp.com/gmmcuda реализация с использованием CUDA]&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MPI еще одна реализация с использованием CUDA]&lt;br /&gt;
# статья об использовании параллельного EM алгоритма в задачах компьютерного зрения &amp;lt;ref name=CV/&amp;gt;&lt;br /&gt;
# статья о распараллеливании EM алгоритма с использованием CUDA &amp;lt;ref name=CUDA/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Noite</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Noite&amp;diff=14415</id>
		<title>Обсуждение участника:Noite</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Noite&amp;diff=14415"/>
		<updated>2016-10-28T12:53:46Z</updated>

		<summary type="html">&lt;p&gt;Noite: /* Замечания к EM-алгоритм_кластеризации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Замечания к [[Участник:Noite/EM-алгоритм_кластеризации]] ==&lt;br /&gt;
&lt;br /&gt;
1) лишняя строка &amp;quot;Алгоритм кластеризации, основанный на максимизации ожидания (EM-алгоритм)&amp;quot; перед содержанием --- убрано&lt;br /&gt;
&lt;br /&gt;
2) отсутствует оценка высоты и ширины ЯПФ параллельного алгоритма во врезке в начале статьи --- врезка исправлена&lt;/div&gt;</summary>
		<author><name>Noite</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:Noite/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=14318</id>
		<title>Участник:Noite/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:Noite/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=14318"/>
		<updated>2016-10-28T08:11:42Z</updated>

		<summary type="html">&lt;p&gt;Noite: добавление в категорию для проверки изменений&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n * m^2 * k)&amp;lt;/math&amp;gt; - одна итерация&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n * m + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Noite|Зинченко Д.А.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
В задачах оптимизации EM-алгоритмом называют итеративную процедуру поиска численного значения экстремума какой-либо функции. В частности, в статистике этот алгоритм используется для оценки максимального правдоподобия. Впервые название EM-алгоритм было предложено в 1977 году&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;, однако его идеи были описаны и раньше&amp;lt;ref name=korolev&amp;gt;В.Ю.Королёв. ЕМ-алгоритм, его модификации и их применение к задаче разделения смесей вероятностных распределений.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм применяется для решения задач двух типов &amp;lt;ref name=korolev/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Анализ неполных данных (данных с пропусками). &lt;br /&gt;
# Оценка максимального правдоподобия в случае, если функцию правдоподобия трудно исследовать аналитически. В этом случае введение набора скрытых переменных может существенно упростить задачу.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к задачам второго типа. В данной статье рассматривается следующая постановка задачи кластеризации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;Дано множество объектов, каждый из которых представляет собой точку в n-мерном метрическом пространстве. Каждому измерению пространства соответствует некоторое свойство объекта. Необходимо разбить это множество на k подмножеств так, чтобы, чтобы элементы каждого подмножества существенно отличались по свойствам от элементов других подмножеств.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование алгоритма EM подразумевает следующее &#039;&#039;предположение об объектах&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Пусть объекты, которые необходимо разбить на кластеры, появляются случайным образом и независимо друг от друга согласно вероятностному распределению, равному смеси (линейной комбинации) распределений кластеров. В данной статье в дальнейшем будет считаться, что распределение каждого кластера является многомерным нормальным распределением с произвольной матрицей ковариации - наиболее часто используемое предположение.&lt;br /&gt;
&lt;br /&gt;
Тогда каждый объект принадлежит каждому кластеру, но с разной вероятностью. EM-алгоритм итеративно оценивает параметры распределений кластеров, максимизируя логарифмическую функцию максимального правдоподобия. После окончания работы алгоритма объект будет отнесен к кластеру, вероятность принадлежности которому максимальна. Вводимый набор скрытых переменных для каждого объекта - вероятности того, что объект принадлежит каждому из кластеров.&lt;br /&gt;
&lt;br /&gt;
Итерация алгоритма состоит из двух последовательных шагов.&lt;br /&gt;
&lt;br /&gt;
# (Expectation) Вычисляются новые ожидаемые значения скрытых переменных.&lt;br /&gt;
# (Maximization) Решается задача максимизации правдоподобия: По текущим значениям скрытых переменных обновляются параметры распределений для кластеров: математическое ожидание, дисперсия и вероятность появления объектов из кластера.&lt;br /&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;N&amp;lt;/math&amp;gt; - количество объектов, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - количество параметров объекта&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\gamma_{n,k}&amp;lt;/math&amp;gt; - значения скрытых переменных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N_{k}&amp;lt;/math&amp;gt; - количество элементов отнесенных к соответствующему кластеру&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{1},...,x_n&amp;lt;/math&amp;gt; - объекты&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Параметры распределений:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{1},...,w_{k}&amp;lt;/math&amp;gt; - вероятности появления объектов из кластеров (веса кластеров), &amp;lt;math&amp;gt;\sum_{k=1}^Kw_{k}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{1},...,\mu_{k}&amp;lt;/math&amp;gt; - центры гауссиан кластеров&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma_{1},...,\Sigma_{k}&amp;lt;/math&amp;gt; - матрицы ковариации гауссиан кластеров, каждая матрица имеет размерность &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Смесь распределений:&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; P(x) = \sum_{j=1}^Kw_jp(x|\mu_{j}, \Sigma_{j})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Цель алгоритма - вычислить параметры распределений, максимизирующих логарифм функции правдоподобия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\ln P(x|w,\mu,\Sigma)= \sum_{n=1}^N \ln \{ \sum_{k=1}^K w_{k}p(x_{n}|\mu_{k},\Sigma_{k})\}&amp;lt;/math&amp;gt;.&amp;lt;/center&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
* В начале работы алгоритма задаются параметры начального приближения:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{i} = 1/K, \mu_{i} = random(x_{j}), i=1..K, j=1..N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{j,j}^{k}=\frac{1}{NK}\sum_{i=1}^N(x_{i,j} - \mu_{k,j})^2, k=1..K, j=1..M&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Поскольку от начального приближения может сильно зависеть результат работы алгоритма, вместо инициализации кластеров случайными центрами, равными весами и диагональными матрицами ковариации, как в приведенных формулах, часто применяют другие способы (подробнее - в [[#Особенности реализации последовательного алгоритма | особенностях реализации]])&#039;&#039;&lt;br /&gt;
* Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
** E-шаг: используя текущее значение параметров &amp;lt;math&amp;gt;w_{1},...,w_{k};\mu_{1},...,\mu_{k};\Sigma^{1},...,\Sigma^{k}&amp;lt;/math&amp;gt;, вычисляем значение вектора скрытых переменных &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\gamma_{n,k}=\frac{w_{k}p(x_{n}|\mu_{k},\Sigma^{k})}{\sum_{j=1}^K w_{j}p(x_{n}|\mu_{j},\Sigma^{j})}, &amp;lt;/math&amp;gt; знаменатель дроби - нормировочный коэффициент&amp;lt;/center&amp;gt;&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p(x|\mu,\Sigma)=\frac{1}{{(2\pi)}^{\frac{N}{2}}\sqrt{|\Sigma|}}exp\biggl\{-\frac{1}{2}{(x-\mu)}^T{\Sigma}^{-1}(x-\mu)\biggr\}&amp;lt;/math&amp;gt; - плотность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерного нормального распределения&amp;lt;/center&amp;gt;&lt;br /&gt;
** М-шаг: переоценка параметров по текущим значениям скрытых переменных для &amp;lt;math&amp;gt;k = 1..K&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\mu^{new}_{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k}x_{n}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{new}^{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k} (x_{n}-\mu_{k}^{new})(x_{n}-\mu_{k}^{new})^{T}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{k}^{new}=\frac{N_{k}}{N}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;N_{k}=\sum_{n=1}^N \gamma_{n,k}&amp;lt;/math&amp;gt;.&amp;lt;/center&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;
Вычислительное ядро алгоритма состоит из двух шагов, повторяющихся каждую итерацию:&lt;br /&gt;
*Обновление скрытых переменных на основе текущих параметров распределений&lt;br /&gt;
*Обновление параметров кластеров: весов, центров и матриц ковариации&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании вычислительного ядра алгоритма]], основную часть алгоритма составляют итеративно проводимые макрооперации: Expectation шаг - вычисление новых значений скрытых переменных, Maximization шаг - обновление параметров кластеров. Макроструктура алгоритма представлена на рисунке 1:&lt;br /&gt;
[[file:EM_macro.png|thumb|center|600px|Рисунок 1: Макроструктура EM-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Примерная схема реализации EM алгоритма с предварительной обработкой матриц ковариации:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
// n - количество объектов&lt;br /&gt;
&lt;br /&gt;
// m - количество координат объектов&lt;br /&gt;
&lt;br /&gt;
// k - количество кластеров&lt;br /&gt;
&lt;br /&gt;
Инициализировать веса и центры кластеров;&lt;br /&gt;
Инициализировать матрицы ковариации;&lt;br /&gt;
&lt;br /&gt;
// Основной цикл&lt;br /&gt;
Пока условие остановки не выполнено&lt;br /&gt;
    // E-шаг&lt;br /&gt;
    В цикле для каждого кластера&lt;br /&gt;
        Вычислить определитель матрицы ковариации Sigma;&lt;br /&gt;
        Вычислить обратную матрицу матрице Sigma;&lt;br /&gt;
    В цикле для каждого объекта&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Вычислить и запомнить p(x | mu, Sigma) для текущего объекта и кластера;&lt;br /&gt;
            Просуммировать вычисленные p(x | mu, Sigma);&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Обновить скрытые переменные gamma;&lt;br /&gt;
    // M-шаг&lt;br /&gt;
    Обновить веса w;&lt;br /&gt;
    Обновить центры кластеров mu;&lt;br /&gt;
    Обновить матрицы ковариации Sigma;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления определителя произвольной матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления матрицы, обратной произвольной матрице ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации - &amp;lt;math&amp;gt;O(k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С учетом заранее вычисленных определителей и обратных матриц сложность вычисления &amp;lt;math&amp;gt;p(x | \mu,\Sigma)&amp;lt;/math&amp;gt; составит: &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага E составит &amp;lt;math&amp;gt;O(n * m^2 * k + k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления весов кластеров &amp;lt;math&amp;gt;O(k * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления центров кластеров &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления одной матрицы ковариации &amp;lt;math&amp;gt;O(n * m)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления всех матриц ковариации &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага M алгоритма - &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит &amp;lt;math&amp;gt;O(k * m^2 * n + k * m^3 + k * m * n)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В предположении, что размерность объектов много меньше их количества &amp;lt;math&amp;gt;m &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt; получим сложность итерации &amp;lt;math&amp;gt;O(k * m^2 * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большУю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее - вынесены за основной цикл шага E&amp;lt;ref name=ParallelEMComparissonGraphLab&amp;gt;Henggang Cui, Jinliang Wei, Wei Dai. Parallel Implementation of Expectation-Maximization for Fast Convergence - School of Computer Science, Carnegie Mellon University. [https://users.ece.cmu.edu/~hengganc/archive/report/final.pdf]&amp;lt;/ref&amp;gt;. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм&amp;lt;ref&amp;gt;Вячеслав Орешков. EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, а суммарная сложность шага E и сложность всей итерации составит &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Макроструктура алгоритма представлена на рисунке 1 (см. [[#Макроструктура алгоритма|раздел 1.4]] статьи).&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 представлена схема вычислений E-шага алгоритма для одного объекта: для объекта &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и параметров &amp;lt;math&amp;gt;w_{j}, \mu_{j}, \Sigma_{j}, j=1..k&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются ненормированные значения скрытых переменных &amp;lt;math&amp;gt;g_{j}&amp;lt;/math&amp;gt;, нормировочный коэффициент &#039;&#039;normСoeff&#039;&#039;, и получаются итоговые значения &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step.png|thumb|center|400px|Рисунок 2: E-шаг EM алгоритма для одного объекта]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 представлена схема вычислений E-шага алгоритма для всех объектов: для объекта &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt; и параметров-векторов &amp;lt;math&amp;gt;w, \mu, \Sigma&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются значения скрытых переменных. &amp;lt;math&amp;gt;E_{i}, i=1..n&amp;lt;/math&amp;gt; - маркооперации, E-шаги для соответствующих объектов.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step_all.png|thumb|center|400px|Рисунок 3: E-шаг EM алгоритма для всех объектов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена схема вычислений M-шага алгоритма для одного кластера: для объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и скрытых переменных &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;, соответствующих степени принадлежности этих объектов кластеру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, согласно формулам шага M [[#Математическое описание алгоритма|раздела 1.2]] вычисляется нормировочный коэффициент &amp;lt;math&amp;gt;N_{j}&amp;lt;/math&amp;gt; и параметры этого кластера: вес &amp;lt;math&amp;gt;w_{j}^{new}&amp;lt;/math&amp;gt;, матрица ковариации &amp;lt;math&amp;gt;\Sigma_{j}^{new}&amp;lt;/math&amp;gt; и центр кластера &amp;lt;math&amp;gt;\mu_{j}^{new}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step.png|thumb|center|400px|Рисунок 4: M-шаг EM алгоритма для одного кластера]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена схема вычислений M-шага алгоритма для всех кластеров. &amp;lt;math&amp;gt;M_{j}, j=1..k&amp;lt;/math&amp;gt; соответствует макрооперации - M-шагу для соответствующего кластера и скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step_all.png|thumb|center|400px|Рисунок 5: M-шаг EM алгоритма для всех кластеров]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Из схем вычислений шагов E и M шагов алгоритма, приведенным в [[#Информационный граф|предыдущем разделе]], видно, что если размерность матрицы ковариации небольшая (тогда вычисление определителя и обратной матрицы матрице ковариации не является трудоемкой операцией), обе макрооперации EM алгоритма можно распараллеливать как по кластерам, так и по объектам.&lt;br /&gt;
&lt;br /&gt;
Как правило количество кластеров, на которые нужно разбить объекты, несравнимо меньше количества объектов, поэтому распараллеливание в большинстве существующих реализаций происходит по объектам: обработка объектов по возможности равномерно распределяются по кластерам. Теоретически (если считать передачу данных между процессорами мгновенной) при наличии неограниченного числа процессоров сложность алгоритма составит &amp;lt;math&amp;gt;O(m^2 * k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* Целое неотрицательное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
* Значения координат объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; объектов с &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; координатами каждый.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;n * m&amp;lt;/math&amp;gt; вещественных чисел (если координаты объектов - вещественные числа), &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целое неотрицательное число.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - для каждого объекта указан номер кластера, к которому он отнесен.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; целых неотрицательных чисел. &lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
=== Преимущества и недостатки&amp;lt;ref&amp;gt;EM алгоритм, его модификации и обобщения. machinelearning.ru [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]&amp;lt;/ref&amp;gt; ===&lt;br /&gt;
EM-алгоритм обладает следующими преимуществами и недостатками:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Преимущества:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Слабо чувствителен к выбросам&lt;br /&gt;
# Прост в реализации&lt;br /&gt;
# Быстро сходится при удачном выборе начальных значений параметров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Неустойчив к выбору начальных значений параметров - от них зависит как скорость сходимости, так и результат работы: алгоритм может сойтись к локальному экстремуму функции правдоподобия, который может быть существенно ниже глобального.&lt;br /&gt;
# Алгоритм не находит оптимальное количество кластеров. Количество кластеров, на которые нужно разбить множество объектов, является параметром алгоритма.&lt;br /&gt;
# При большой размерности пространства объектов выдвинутое предположение о модели их распределения может быть некорректным.&lt;br /&gt;
&lt;br /&gt;
=== Влияние структуры матрицы ковариации на форму кластера ===&lt;br /&gt;
&lt;br /&gt;
[[file:DifferentCovariance.png|thumb|center|800px|Рисунок 6: Влияние структуры матрицы ковариации на форму кластеров для двумерного случая. a) - матрицы ковариации являются диагональными, b) - матрицы ковариации произвольны. &amp;lt;ref&amp;gt;Mathworks: Clustering Using Gaussian Mixture Models [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 6 наглядно показывает, что при диагональной форме матриц ковариации полуоси эллипса (в общем случае - эллипсоида), соответствующего распределению объектов, отнесенных кластеру, параллельны осям координат объектов. В противном случае полуоси могут располагаться произвольным образом.&lt;br /&gt;
&lt;br /&gt;
=== Общие свойства ===&lt;br /&gt;
[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] EM алгоритма равна &amp;lt;math&amp;gt;m * k * it&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - размерность объекта, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров, а &amp;lt;math&amp;gt;it&amp;lt;/math&amp;gt; - количество итераций. &lt;br /&gt;
&lt;br /&gt;
EM-алгоритм является итерационным, и число итераций в общем случае не фиксировано: оно зависит от условий остановки, начальных приближений и расположения объектов. Поэтому этот алгоритм &#039;&#039;недетерминированный&#039;&#039;. По тем же причинам EM-алгоритм является &#039;&#039;неустойчивым&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
=== Инициализация параметров распределений ===&lt;br /&gt;
Наиболее распространены 3 способа инициализации центров распределений для EM алгоритма:&lt;br /&gt;
# центр распределения совпадает со случайно выбранным объектом &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
# все наблюдения распределяются по кластерам случайным образом, а затем для каждого кластера пересчитывается цент соответствующего распределения&lt;br /&gt;
# центры кластеров получаются в результате работы алгоритма k-means. Использование такой инициализации оправдано тем, что k-means требует меньших вычислительных затрат и быстрее сходится&amp;lt;ref&amp;gt;EM алгоритм (пример) machinelearning.ru [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])&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Многие статьи&amp;lt;ref name=FREERIDE&amp;gt;Leonid Glimcher, Gagan Agrawal. Parallelising EM Algorithm on a Cluster of SMPs [http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CV&amp;gt;López-de-Teruel P. E., García J. M., Acacio; The Parallel EM Algorithm and its Applications in Computer Vision [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=MULTITHREAD&amp;gt;Sharon X. Lee, Kaleb L. Leemaqz, Geoffrey J. McLachlan. A simple multithreaded implementation of the EM algorithm for mixture models [https://arxiv.org/pdf/1606.02054.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CUDA&amp;gt;Araújo, G.F., H.T. Macedo, M.T. Chella, C.A.E. Montesco and M.V.O. Medeiros. PARALLEL IMPLEMENTATION OF EXPECTATION-MAXIMISATION ALGORITHM FOR THE TRAINING OF GAUSSIAN MIXTURE MODELS [https://ri.ufs.br/bitstream/123456789/1764/1/ExpectationMaximisationAlgorithm.pdf]&amp;lt;/ref&amp;gt;, в которых представлены параллельные реализации EM алгоритма, описывают помимо использующихся программных и аппаратных решений результаты проведенных экспериментов с данными. В качестве примера в этом разделе будут рассмотрены результаты эксперементов, проведенных со связующим программным обеспечением (&#039;&#039;middleware&#039;&#039;) FREERIDE&amp;lt;ref&amp;gt;Leonid Glimchera, Ruoming Jinb, Gagan Agrawala. Middleware for data mining applications on clusters and grids [http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf]&amp;lt;/ref&amp;gt; (FRamework for Rapid Implementation of Datamining Engines), обеспечивающим возможность распараллеливания как для систем с общей памятью (в частности, симметричных мультипроцессорных систем), так и для систем с распределенной памятью.&lt;br /&gt;
&lt;br /&gt;
Эксперименты проводились на кластере машин Pentium 700MHz связанных при помощи Myrinet&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Myrinet&amp;lt;/ref&amp;gt; LANai 7.0 на трех наборах данных: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;а)&#039;&#039;&#039; 3.3 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; 6.2 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; 12.5 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
Объекты представляют собой координаты точек 10-мерного пространства.&lt;br /&gt;
 &lt;br /&gt;
Количество машин в кластере варьировалось от 1 до 8, при этом на каждой машине запускалось до четырех параллельных потоков.&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов представлены на рисунках 7-9&amp;lt;ref name=FREERIDE/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_a.png|thumb|center|350px|Рисунок 7: набор данных a)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_b.png|thumb|center|357px|Рисунок 8: набор данных b)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_c.png|thumb|center|351px|Рисунок 9: набор данных c)]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что используемые в данном исследовании машины, как и коммуникационная среда, сейчас не используются и считаются устаревшими, результат приведенных экспериментов наглядно показывает, что EM алгоритм хорошо параллелится, зависимость ускорения от числа узлов в кластере с небольшим количеством узлов близка к линейной, а также, что скорость работы алгоритма линейно зависит от числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Данный раздел может быть дополнен&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Примеры библиотек, содержащих последовательную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV(C++)] ([https://github.com/opencv/opencv/blob/master/modules/ml/src/em.cpp github])&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab]&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html Scikit learn (Python)]&lt;br /&gt;
# [http://mlpack.org/index.html MLPack(C++)]&lt;br /&gt;
&lt;br /&gt;
Примеры библиотек, содержащих параллельную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Здесь приводятся как конкретные реализации, так и статьи, описывающие подходы к реализациям распараллеливания EM-алгоритма&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# [https://spark.apache.org/ Apache Spark]&lt;br /&gt;
# [http://accord-framework.net/ Accord.NET Framework (C#)]&lt;br /&gt;
# Статья об использовании FREERIDE middleware для распараллеливания EM алгоритма &amp;lt;ref name=FREERIDE/&amp;gt; &lt;br /&gt;
# [http://andrewharp.com/gmmcuda реализация с использованием CUDA]&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MPI еще одна реализация с использованием CUDA]&lt;br /&gt;
# статья об использовании параллельного EM алгоритма в задачах компьютерного зрения &amp;lt;ref name=CV/&amp;gt;&lt;br /&gt;
# статья о распараллеливании EM алгоритма с использованием CUDA &amp;lt;ref name=CUDA/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Noite</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Noite&amp;diff=13785</id>
		<title>Обсуждение участника:Noite</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Noite&amp;diff=13785"/>
		<updated>2016-10-25T16:24:39Z</updated>

		<summary type="html">&lt;p&gt;Noite: /* Замечания к EM-алгоритм_кластеризации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Замечания к [[EM-алгоритм_кластеризации]] ==&lt;br /&gt;
&lt;br /&gt;
1) лишняя строка &amp;quot;Алгоритм кластеризации, основанный на максимизации ожидания (EM-алгоритм)&amp;quot; перед содержанием --- убрано&lt;br /&gt;
&lt;br /&gt;
2) отсутствует оценка высоты и ширины ЯПФ параллельного алгоритма во врезке в начале статьи --- врезка исправлена&lt;/div&gt;</summary>
		<author><name>Noite</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:Noite/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=13784</id>
		<title>Участник:Noite/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:Noite/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=13784"/>
		<updated>2016-10-25T16:24:20Z</updated>

		<summary type="html">&lt;p&gt;Noite: Исправление замечаний v1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n * m^2 * k)&amp;lt;/math&amp;gt; - одна итерация&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n * m + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Noite|Зинченко Д.А.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
В задачах оптимизации EM-алгоритмом называют итеративную процедуру поиска численного значения экстремума какой-либо функции. В частности, в статистике этот алгоритм используется для оценки максимального правдоподобия. Впервые название EM-алгоритм было предложено в 1977 году&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;, однако его идеи были описаны и раньше&amp;lt;ref name=korolev&amp;gt;В.Ю.Королёв. ЕМ-алгоритм, его модификации и их применение к задаче разделения смесей вероятностных распределений.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм применяется для решения задач двух типов &amp;lt;ref name=korolev/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Анализ неполных данных (данных с пропусками). &lt;br /&gt;
# Оценка максимального правдоподобия в случае, если функцию правдоподобия трудно исследовать аналитически. В этом случае введение набора скрытых переменных может существенно упростить задачу.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к задачам второго типа. В данной статье рассматривается следующая постановка задачи кластеризации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;Дано множество объектов, каждый из которых представляет собой точку в n-мерном метрическом пространстве. Каждому измерению пространства соответствует некоторое свойство объекта. Необходимо разбить это множество на k подмножеств так, чтобы, чтобы элементы каждого подмножества существенно отличались по свойствам от элементов других подмножеств.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование алгоритма EM подразумевает следующее &#039;&#039;предположение об объектах&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Пусть объекты, которые необходимо разбить на кластеры, появляются случайным образом и независимо друг от друга согласно вероятностному распределению, равному смеси (линейной комбинации) распределений кластеров. В данной статье в дальнейшем будет считаться, что распределение каждого кластера является многомерным нормальным распределением с произвольной матрицей ковариации - наиболее часто используемое предположение.&lt;br /&gt;
&lt;br /&gt;
Тогда каждый объект принадлежит каждому кластеру, но с разной вероятностью. EM-алгоритм итеративно оценивает параметры распределений кластеров, максимизируя логарифмическую функцию максимального правдоподобия. После окончания работы алгоритма объект будет отнесен к кластеру, вероятность принадлежности которому максимальна. Вводимый набор скрытых переменных для каждого объекта - вероятности того, что объект принадлежит каждому из кластеров.&lt;br /&gt;
&lt;br /&gt;
Итерация алгоритма состоит из двух последовательных шагов.&lt;br /&gt;
&lt;br /&gt;
# (Expectation) Вычисляются новые ожидаемые значения скрытых переменных.&lt;br /&gt;
# (Maximization) Решается задача максимизации правдоподобия: По текущим значениям скрытых переменных обновляются параметры распределений для кластеров: математическое ожидание, дисперсия и вероятность появления объектов из кластера.&lt;br /&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;N&amp;lt;/math&amp;gt; - количество объектов, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - количество параметров объекта&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\gamma_{n,k}&amp;lt;/math&amp;gt; - значения скрытых переменных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N_{k}&amp;lt;/math&amp;gt; - количество элементов отнесенных к соответствующему кластеру&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{1},...,x_n&amp;lt;/math&amp;gt; - объекты&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Параметры распределений:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{1},...,w_{k}&amp;lt;/math&amp;gt; - вероятности появления объектов из кластеров (веса кластеров), &amp;lt;math&amp;gt;\sum_{k=1}^Kw_{k}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{1},...,\mu_{k}&amp;lt;/math&amp;gt; - центры гауссиан кластеров&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma_{1},...,\Sigma_{k}&amp;lt;/math&amp;gt; - матрицы ковариации гауссиан кластеров, каждая матрица имеет размерность &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Смесь распределений:&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; P(x) = \sum_{j=1}^Kw_jp(x|\mu_{j}, \Sigma_{j})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Цель алгоритма - вычислить параметры распределений, максимизирующих логарифм функции правдоподобия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\ln P(x|w,\mu,\Sigma)= \sum_{n=1}^N \ln \{ \sum_{k=1}^K w_{k}p(x_{n}|\mu_{k},\Sigma_{k})\}&amp;lt;/math&amp;gt;.&amp;lt;/center&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
* В начале работы алгоритма задаются параметры начального приближения:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{i} = 1/K, \mu_{i} = random(x_{j}), i=1..K, j=1..N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{j,j}^{k}=\frac{1}{NK}\sum_{i=1}^N(x_{i,j} - \mu_{k,j})^2, k=1..K, j=1..M&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Поскольку от начального приближения может сильно зависеть результат работы алгоритма, вместо инициализации кластеров случайными центрами, равными весами и диагональными матрицами ковариации, как в приведенных формулах, часто применяют другие способы (подробнее - в [[#Особенности реализации последовательного алгоритма | особенностях реализации]])&#039;&#039;&lt;br /&gt;
* Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
** E-шаг: используя текущее значение параметров &amp;lt;math&amp;gt;w_{1},...,w_{k};\mu_{1},...,\mu_{k};\Sigma^{1},...,\Sigma^{k}&amp;lt;/math&amp;gt;, вычисляем значение вектора скрытых переменных &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\gamma_{n,k}=\frac{w_{k}p(x_{n}|\mu_{k},\Sigma^{k})}{\sum_{j=1}^K w_{j}p(x_{n}|\mu_{j},\Sigma^{j})}, &amp;lt;/math&amp;gt; знаменатель дроби - нормировочный коэффициент&amp;lt;/center&amp;gt;&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p(x|\mu,\Sigma)=\frac{1}{{(2\pi)}^{\frac{N}{2}}\sqrt{|\Sigma|}}exp\biggl\{-\frac{1}{2}{(x-\mu)}^T{\Sigma}^{-1}(x-\mu)\biggr\}&amp;lt;/math&amp;gt; - плотность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерного нормального распределения&amp;lt;/center&amp;gt;&lt;br /&gt;
** М-шаг: переоценка параметров по текущим значениям скрытых переменных для &amp;lt;math&amp;gt;k = 1..K&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\mu^{new}_{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k}x_{n}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{new}^{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k} (x_{n}-\mu_{k}^{new})(x_{n}-\mu_{k}^{new})^{T}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{k}^{new}=\frac{N_{k}}{N}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;N_{k}=\sum_{n=1}^N \gamma_{n,k}&amp;lt;/math&amp;gt;.&amp;lt;/center&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;
Вычислительное ядро алгоритма состоит из двух шагов, повторяющихся каждую итерацию:&lt;br /&gt;
*Обновление скрытых переменных на основе текущих параметров распределений&lt;br /&gt;
*Обновление параметров кластеров: весов, центров и матриц ковариации&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании вычислительного ядра алгоритма]], основную часть алгоритма составляют итеративно проводимые макрооперации: Expectation шаг - вычисление новых значений скрытых переменных, Maximization шаг - обновление параметров кластеров. Макроструктура алгоритма представлена на рисунке 1:&lt;br /&gt;
[[file:EM_macro.png|thumb|center|600px|Рисунок 1: Макроструктура EM-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Примерная схема реализации EM алгоритма с предварительной обработкой матриц ковариации:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
// n - количество объектов&lt;br /&gt;
&lt;br /&gt;
// m - количество координат объектов&lt;br /&gt;
&lt;br /&gt;
// k - количество кластеров&lt;br /&gt;
&lt;br /&gt;
Инициализировать веса и центры кластеров;&lt;br /&gt;
Инициализировать матрицы ковариации;&lt;br /&gt;
&lt;br /&gt;
// Основной цикл&lt;br /&gt;
Пока условие остановки не выполнено&lt;br /&gt;
    // E-шаг&lt;br /&gt;
    В цикле для каждого кластера&lt;br /&gt;
        Вычислить определитель матрицы ковариации Sigma;&lt;br /&gt;
        Вычислить обратную матрицу матрице Sigma;&lt;br /&gt;
    В цикле для каждого объекта&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Вычислить и запомнить p(x | mu, Sigma) для текущего объекта и кластера;&lt;br /&gt;
            Просуммировать вычисленные p(x | mu, Sigma);&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Обновить скрытые переменные gamma;&lt;br /&gt;
    // M-шаг&lt;br /&gt;
    Обновить веса w;&lt;br /&gt;
    Обновить центры кластеров mu;&lt;br /&gt;
    Обновить матрицы ковариации Sigma;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления определителя произвольной матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления матрицы, обратной произвольной матрице ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации - &amp;lt;math&amp;gt;O(k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С учетом заранее вычисленных определителей и обратных матриц сложность вычисления &amp;lt;math&amp;gt;p(x | \mu,\Sigma)&amp;lt;/math&amp;gt; составит: &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага E составит &amp;lt;math&amp;gt;O(n * m^2 * k + k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления весов кластеров &amp;lt;math&amp;gt;O(k * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления центров кластеров &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления одной матрицы ковариации &amp;lt;math&amp;gt;O(n * m)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления всех матриц ковариации &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага M алгоритма - &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит &amp;lt;math&amp;gt;O(k * m^2 * n + k * m^3 + k * m * n)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В предположении, что размерность объектов много меньше их количества &amp;lt;math&amp;gt;m &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt; получим сложность итерации &amp;lt;math&amp;gt;O(k * m^2 * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большУю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее - вынесены за основной цикл шага E&amp;lt;ref name=ParallelEMComparissonGraphLab&amp;gt;Henggang Cui, Jinliang Wei, Wei Dai. Parallel Implementation of Expectation-Maximization for Fast Convergence - School of Computer Science, Carnegie Mellon University. [https://users.ece.cmu.edu/~hengganc/archive/report/final.pdf]&amp;lt;/ref&amp;gt;. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм&amp;lt;ref&amp;gt;Вячеслав Орешков. EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, а суммарная сложность шага E и сложность всей итерации составит &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Макроструктура алгоритма представлена на рисунке 1 (см. [[#Макроструктура алгоритма|раздел 1.4]] статьи).&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 представлена схема вычислений E-шага алгоритма для одного объекта: для объекта &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и параметров &amp;lt;math&amp;gt;w_{j}, \mu_{j}, \Sigma_{j}, j=1..k&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются ненормированные значения скрытых переменных &amp;lt;math&amp;gt;g_{j}&amp;lt;/math&amp;gt;, нормировочный коэффициент &#039;&#039;normСoeff&#039;&#039;, и получаются итоговые значения &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step.png|thumb|center|400px|Рисунок 2: E-шаг EM алгоритма для одного объекта]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 представлена схема вычислений E-шага алгоритма для всех объектов: для объекта &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt; и параметров-векторов &amp;lt;math&amp;gt;w, \mu, \Sigma&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются значения скрытых переменных. &amp;lt;math&amp;gt;E_{i}, i=1..n&amp;lt;/math&amp;gt; - маркооперации, E-шаги для соответствующих объектов.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step_all.png|thumb|center|400px|Рисунок 3: E-шаг EM алгоритма для всех объектов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена схема вычислений M-шага алгоритма для одного кластера: для объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и скрытых переменных &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;, соответствующих степени принадлежности этих объектов кластеру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, согласно формулам шага M [[#Математическое описание алгоритма|раздела 1.2]] вычисляется нормировочный коэффициент &amp;lt;math&amp;gt;N_{j}&amp;lt;/math&amp;gt; и параметры этого кластера: вес &amp;lt;math&amp;gt;w_{j}^{new}&amp;lt;/math&amp;gt;, матрица ковариации &amp;lt;math&amp;gt;\Sigma_{j}^{new}&amp;lt;/math&amp;gt; и центр кластера &amp;lt;math&amp;gt;\mu_{j}^{new}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step.png|thumb|center|400px|Рисунок 4: M-шаг EM алгоритма для одного кластера]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена схема вычислений M-шага алгоритма для всех кластеров. &amp;lt;math&amp;gt;M_{j}, j=1..k&amp;lt;/math&amp;gt; соответствует макрооперации - M-шагу для соответствующего кластера и скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step_all.png|thumb|center|400px|Рисунок 5: M-шаг EM алгоритма для всех кластеров]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Из схем вычислений шагов E и M шагов алгоритма, приведенным в [[#Информационный граф|предыдущем разделе]], видно, что если размерность матрицы ковариации небольшая (тогда вычисление определителя и обратной матрицы матрице ковариации не является трудоемкой операцией), обе макрооперации EM алгоритма можно распараллеливать как по кластерам, так и по объектам.&lt;br /&gt;
&lt;br /&gt;
Как правило количество кластеров, на которые нужно разбить объекты, несравнимо меньше количества объектов, поэтому распараллеливание в большинстве существующих реализаций происходит по объектам: обработка объектов по возможности равномерно распределяются по кластерам. Теоретически (если считать передачу данных между процессорами мгновенной) при наличии неограниченного числа процессоров сложность алгоритма составит &amp;lt;math&amp;gt;O(m^2 * k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* Целое неотрицательное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
* Значения координат объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; объектов с &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; координатами каждый.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;n * m&amp;lt;/math&amp;gt; вещественных чисел (если координаты объектов - вещественные числа), &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целое неотрицательное число.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - для каждого объекта указан номер кластера, к которому он отнесен.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; целых неотрицательных чисел. &lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
=== Преимущества и недостатки&amp;lt;ref&amp;gt;EM алгоритм, его модификации и обобщения. machinelearning.ru [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]&amp;lt;/ref&amp;gt; ===&lt;br /&gt;
EM-алгоритм обладает следующими преимуществами и недостатками:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Преимущества:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Слабо чувствителен к выбросам&lt;br /&gt;
# Прост в реализации&lt;br /&gt;
# Быстро сходится при удачном выборе начальных значений параметров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Неустойчив к выбору начальных значений параметров - от них зависит как скорость сходимости, так и результат работы: алгоритм может сойтись к локальному экстремуму функции правдоподобия, который может быть существенно ниже глобального.&lt;br /&gt;
# Алгоритм не находит оптимальное количество кластеров. Количество кластеров, на которые нужно разбить множество объектов, является параметром алгоритма.&lt;br /&gt;
# При большой размерности пространства объектов выдвинутое предположение о модели их распределения может быть некорректным.&lt;br /&gt;
&lt;br /&gt;
=== Влияние структуры матрицы ковариации на форму кластера ===&lt;br /&gt;
&lt;br /&gt;
[[file:DifferentCovariance.png|thumb|center|800px|Рисунок 6: Влияние структуры матрицы ковариации на форму кластеров для двумерного случая. a) - матрицы ковариации являются диагональными, b) - матрицы ковариации произвольны. &amp;lt;ref&amp;gt;Mathworks: Clustering Using Gaussian Mixture Models [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 6 наглядно показывает, что при диагональной форме матриц ковариации полуоси эллипса (в общем случае - эллипсоида), соответствующего распределению объектов, отнесенных кластеру, параллельны осям координат объектов. В противном случае полуоси могут располагаться произвольным образом.&lt;br /&gt;
&lt;br /&gt;
=== Общие свойства ===&lt;br /&gt;
[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] EM алгоритма равна &amp;lt;math&amp;gt;m * k * it&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - размерность объекта, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров, а &amp;lt;math&amp;gt;it&amp;lt;/math&amp;gt; - количество итераций. &lt;br /&gt;
&lt;br /&gt;
EM-алгоритм является итерационным, и число итераций в общем случае не фиксировано: оно зависит от условий остановки, начальных приближений и расположения объектов. Поэтому этот алгоритм &#039;&#039;недетерминированный&#039;&#039;. По тем же причинам EM-алгоритм является &#039;&#039;неустойчивым&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
=== Инициализация параметров распределений ===&lt;br /&gt;
Наиболее распространены 3 способа инициализации центров распределений для EM алгоритма:&lt;br /&gt;
# центр распределения совпадает со случайно выбранным объектом &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
# все наблюдения распределяются по кластерам случайным образом, а затем для каждого кластера пересчитывается цент соответствующего распределения&lt;br /&gt;
# центры кластеров получаются в результате работы алгоритма k-means. Использование такой инициализации оправдано тем, что k-means требует меньших вычислительных затрат и быстрее сходится&amp;lt;ref&amp;gt;EM алгоритм (пример) machinelearning.ru [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])&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Многие статьи&amp;lt;ref name=FREERIDE&amp;gt;Leonid Glimcher, Gagan Agrawal. Parallelising EM Algorithm on a Cluster of SMPs [http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CV&amp;gt;López-de-Teruel P. E., García J. M., Acacio; The Parallel EM Algorithm and its Applications in Computer Vision [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=MULTITHREAD&amp;gt;Sharon X. Lee, Kaleb L. Leemaqz, Geoffrey J. McLachlan. A simple multithreaded implementation of the EM algorithm for mixture models [https://arxiv.org/pdf/1606.02054.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CUDA&amp;gt;Araújo, G.F., H.T. Macedo, M.T. Chella, C.A.E. Montesco and M.V.O. Medeiros. PARALLEL IMPLEMENTATION OF EXPECTATION-MAXIMISATION ALGORITHM FOR THE TRAINING OF GAUSSIAN MIXTURE MODELS [https://ri.ufs.br/bitstream/123456789/1764/1/ExpectationMaximisationAlgorithm.pdf]&amp;lt;/ref&amp;gt;, в которых представлены параллельные реализации EM алгоритма, описывают помимо использующихся программных и аппаратных решений результаты проведенных экспериментов с данными. В качестве примера в этом разделе будут рассмотрены результаты эксперементов, проведенных со связующим программным обеспечением (&#039;&#039;middleware&#039;&#039;) FREERIDE&amp;lt;ref&amp;gt;Leonid Glimchera, Ruoming Jinb, Gagan Agrawala. Middleware for data mining applications on clusters and grids [http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf]&amp;lt;/ref&amp;gt; (FRamework for Rapid Implementation of Datamining Engines), обеспечивающим возможность распараллеливания как для систем с общей памятью (в частности, симметричных мультипроцессорных систем), так и для систем с распределенной памятью.&lt;br /&gt;
&lt;br /&gt;
Эксперименты проводились на кластере машин Pentium 700MHz связанных при помощи Myrinet&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Myrinet&amp;lt;/ref&amp;gt; LANai 7.0 на трех наборах данных: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;а)&#039;&#039;&#039; 3.3 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; 6.2 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; 12.5 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
Объекты представляют собой координаты точек 10-мерного пространства.&lt;br /&gt;
 &lt;br /&gt;
Количество машин в кластере варьировалось от 1 до 8, при этом на каждой машине запускалось до четырех параллельных потоков.&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов представлены на рисунках 7-9&amp;lt;ref name=FREERIDE/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_a.png|thumb|center|350px|Рисунок 7: набор данных a)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_b.png|thumb|center|357px|Рисунок 8: набор данных b)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_c.png|thumb|center|351px|Рисунок 9: набор данных c)]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что используемые в данном исследовании машины, как и коммуникационная среда, сейчас не используются и считаются устаревшими, результат приведенных экспериментов наглядно показывает, что EM алгоритм хорошо параллелится, зависимость ускорения от числа узлов в кластере с небольшим количеством узлов близка к линейной, а также, что скорость работы алгоритма линейно зависит от числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Данный раздел может быть дополнен&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Примеры библиотек, содержащих последовательную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV(C++)] ([https://github.com/opencv/opencv/blob/master/modules/ml/src/em.cpp github])&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab]&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html Scikit learn (Python)]&lt;br /&gt;
# [http://mlpack.org/index.html MLPack(C++)]&lt;br /&gt;
&lt;br /&gt;
Примеры библиотек, содержащих параллельную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Здесь приводятся как конкретные реализации, так и статьи, описывающие подходы к реализациям распараллеливания EM-алгоритма&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# [https://spark.apache.org/ Apache Spark]&lt;br /&gt;
# [http://accord-framework.net/ Accord.NET Framework (C#)]&lt;br /&gt;
# Статья об использовании FREERIDE middleware для распараллеливания EM алгоритма &amp;lt;ref name=FREERIDE/&amp;gt; &lt;br /&gt;
# [http://andrewharp.com/gmmcuda реализация с использованием CUDA]&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MPI еще одна реализация с использованием CUDA]&lt;br /&gt;
# статья об использовании параллельного EM алгоритма в задачах компьютерного зрения &amp;lt;ref name=CV/&amp;gt;&lt;br /&gt;
# статья о распараллеливании EM алгоритма с использованием CUDA &amp;lt;ref name=CUDA/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Noite</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:Noite/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=6849</id>
		<title>Участник:Noite/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:Noite/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=6849"/>
		<updated>2016-10-13T19:59:31Z</updated>

		<summary type="html">&lt;p&gt;Noite: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n * m^2 * k)&amp;lt;/math&amp;gt; - одна итерация&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n * m + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Noite|Зинченко Д.А.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм кластеризации, основанный на максимизации ожидания (EM-алгоритм) &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
В задачах оптимизации EM-алгоритмом называют итеративную процедуру поиска численного значения экстремума какой-либо функции. В частности, в статистике этот алгоритм используется для оценки максимального правдоподобия. Впервые название EM-алгоритм было предложено в 1977 году&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;, однако его идеи были описаны и раньше&amp;lt;ref name=korolev&amp;gt;В.Ю.Королёв. ЕМ-алгоритм, его модификации и их применение к задаче разделения смесей вероятностных распределений.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм применяется для решения задач двух типов &amp;lt;ref name=korolev/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Анализ неполных данных (данных с пропусками). &lt;br /&gt;
# Оценка максимального правдоподобия в случае, если функцию правдоподобия трудно исследовать аналитически. В этом случае введение набора скрытых переменных может существенно упростить задачу.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к задачам второго типа. В данной статье рассматривается следующая постановка задачи кластеризации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;Дано множество объектов, каждый из которых представляет собой точку в n-мерном метрическом пространстве. Каждому измерению пространства соответствует некоторое свойство объекта. Необходимо разбить это множество на k подмножеств так, чтобы, чтобы элементы каждого подмножества существенно отличались по свойствам от элементов других подмножеств.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование алгоритма EM подразумевает следующее &#039;&#039;предположение об объектах&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Пусть объекты, которые необходимо разбить на кластеры, появляются случайным образом и независимо друг от друга согласно вероятностному распределению, равному смеси (линейной комбинации) распределений кластеров. В данной статье в дальнейшем будет считаться, что распределение каждого кластера является многомерным нормальным распределением с произвольной матрицей ковариации - наиболее часто используемое предположение.&lt;br /&gt;
&lt;br /&gt;
Тогда каждый объект принадлежит каждому кластеру, но с разной вероятностью. EM-алгоритм итеративно оценивает параметры распределений кластеров, максимизируя логарифмическую функцию максимального правдоподобия. После окончания работы алгоритма объект будет отнесен к кластеру, вероятность принадлежности которому максимальна. Вводимый набор скрытых переменных для каждого объекта - вероятности того, что объект принадлежит каждому из кластеров.&lt;br /&gt;
&lt;br /&gt;
Итерация алгоритма состоит из двух последовательных шагов.&lt;br /&gt;
&lt;br /&gt;
# (Expectation) Вычисляются новые ожидаемые значения скрытых переменных.&lt;br /&gt;
# (Maximization) Решается задача максимизации правдоподобия: По текущим значениям скрытых переменных обновляются параметры распределений для кластеров: математическое ожидание, дисперсия и вероятность появления объектов из кластера.&lt;br /&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;N&amp;lt;/math&amp;gt; - количество объектов, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - количество параметров объекта&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\gamma_{n,k}&amp;lt;/math&amp;gt; - значения скрытых переменных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N_{k}&amp;lt;/math&amp;gt; - количество элементов отнесенных к соответствующему кластеру&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{1},...,x_n&amp;lt;/math&amp;gt; - объекты&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Параметры распределений:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{1},...,w_{k}&amp;lt;/math&amp;gt; - вероятности появления объектов из кластеров (веса кластеров), &amp;lt;math&amp;gt;\sum_{k=1}^Kw_{k}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{1},...,\mu_{k}&amp;lt;/math&amp;gt; - центры гауссиан кластеров&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma_{1},...,\Sigma_{k}&amp;lt;/math&amp;gt; - матрицы ковариации гауссиан кластеров, каждая матрица имеет размерность &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Смесь распределений:&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; P(x) = \sum_{j=1}^Kw_jp(x|\mu_{j}, \Sigma_{j})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Цель алгоритма - вычислить параметры распределений, максимизирующих логарифм функции правдоподобия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\ln P(x|w,\mu,\Sigma)= \sum_{n=1}^N \ln \{ \sum_{k=1}^K w_{k}p(x_{n}|\mu_{k},\Sigma_{k})\}&amp;lt;/math&amp;gt;.&amp;lt;/center&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
* В начале работы алгоритма задаются параметры начального приближения:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{i} = 1/K, \mu_{i} = random(x_{j}), i=1..K, j=1..N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{j,j}^{k}=\frac{1}{NK}\sum_{i=1}^N(x_{i,j} - \mu_{k,j})^2, k=1..K, j=1..M&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Поскольку от начального приближения может сильно зависеть результат работы алгоритма, вместо инициализации кластеров случайными центрами, равными весами и диагональными матрицами ковариации, как в приведенных формулах, часто применяют другие способы (подробнее - в [[#Особенности реализации последовательного алгоритма | особенностях реализации]])&#039;&#039;&lt;br /&gt;
* Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
** E-шаг: используя текущее значение параметров &amp;lt;math&amp;gt;w_{1},...,w_{k};\mu_{1},...,\mu_{k};\Sigma^{1},...,\Sigma^{k}&amp;lt;/math&amp;gt;, вычисляем значение вектора скрытых переменных &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\gamma_{n,k}=\frac{w_{k}p(x_{n}|\mu_{k},\Sigma^{k})}{\sum_{j=1}^K w_{j}p(x_{n}|\mu_{j},\Sigma^{j})}, &amp;lt;/math&amp;gt; знаменатель дроби - нормировочный коэффициент&amp;lt;/center&amp;gt;&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p(x|\mu,\Sigma)=\frac{1}{{(2\pi)}^{\frac{N}{2}}\sqrt{|\Sigma|}}exp\biggl\{-\frac{1}{2}{(x-\mu)}^T{\Sigma}^{-1}(x-\mu)\biggr\}&amp;lt;/math&amp;gt; - плотность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерного нормального распределения&amp;lt;/center&amp;gt;&lt;br /&gt;
** М-шаг: переоценка параметров по текущим значениям скрытых переменных для &amp;lt;math&amp;gt;k = 1..K&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\mu^{new}_{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k}x_{n}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{new}^{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k} (x_{n}-\mu_{k}^{new})(x_{n}-\mu_{k}^{new})^{T}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{k}^{new}=\frac{N_{k}}{N}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;N_{k}=\sum_{n=1}^N \gamma_{n,k}&amp;lt;/math&amp;gt;.&amp;lt;/center&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;
Вычислительное ядро алгоритма состоит из двух шагов, повторяющихся каждую итерацию:&lt;br /&gt;
*Обновление скрытых переменных на основе текущих параметров распределений&lt;br /&gt;
*Обновление параметров кластеров: весов, центров и матриц ковариации&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании вычислительного ядра алгоритма]], основную часть алгоритма составляют итеративно проводимые макрооперации: Expectation шаг - вычисление новых значений скрытых переменных, Maximization шаг - обновление параметров кластеров. Макроструктура алгоритма представлена на рисунке 1:&lt;br /&gt;
[[file:EM_macro.png|thumb|center|600px|Рисунок 1: Макроструктура EM-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Примерная схема реализации EM алгоритма с предварительной обработкой матриц ковариации:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
// n - количество объектов&lt;br /&gt;
&lt;br /&gt;
// m - количество координат объектов&lt;br /&gt;
&lt;br /&gt;
// k - количество кластеров&lt;br /&gt;
&lt;br /&gt;
Инициализировать веса и центры кластеров;&lt;br /&gt;
Инициализировать матрицы ковариации;&lt;br /&gt;
&lt;br /&gt;
// Основной цикл&lt;br /&gt;
Пока условие остановки не выполнено&lt;br /&gt;
    // E-шаг&lt;br /&gt;
    В цикле для каждого кластера&lt;br /&gt;
        Вычислить определитель матрицы ковариации Sigma;&lt;br /&gt;
        Вычислить обратную матрицу матрице Sigma;&lt;br /&gt;
    В цикле для каждого объекта&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Вычислить и запомнить p(x | mu, Sigma) для текущего объекта и кластера;&lt;br /&gt;
            Просуммировать вычисленные p(x | mu, Sigma);&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Обновить скрытые переменные gamma;&lt;br /&gt;
    // M-шаг&lt;br /&gt;
    Обновить веса w;&lt;br /&gt;
    Обновить центры кластеров mu;&lt;br /&gt;
    Обновить матрицы ковариации Sigma;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления определителя произвольной матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления матрицы, обратной произвольной матрице ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации - &amp;lt;math&amp;gt;O(k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С учетом заранее вычисленных определителей и обратных матриц сложность вычисления &amp;lt;math&amp;gt;p(x | \mu,\Sigma)&amp;lt;/math&amp;gt; составит: &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага E составит &amp;lt;math&amp;gt;O(n * m^2 * k + k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления весов кластеров &amp;lt;math&amp;gt;O(k * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления центров кластеров &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления одной матрицы ковариации &amp;lt;math&amp;gt;O(n * m)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления всех матриц ковариации &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага M алгоритма - &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит &amp;lt;math&amp;gt;O(k * m^2 * n + k * m^3 + k * m * n)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В предположении, что размерность объектов много меньше их количества &amp;lt;math&amp;gt;m &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt; получим сложность итерации &amp;lt;math&amp;gt;O(k * m^2 * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большУю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее - вынесены за основной цикл шага E&amp;lt;ref name=ParallelEMComparissonGraphLab&amp;gt;Henggang Cui, Jinliang Wei, Wei Dai. Parallel Implementation of Expectation-Maximization for Fast Convergence - School of Computer Science, Carnegie Mellon University. [https://users.ece.cmu.edu/~hengganc/archive/report/final.pdf]&amp;lt;/ref&amp;gt;. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм&amp;lt;ref&amp;gt;Вячеслав Орешков. EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, а суммарная сложность шага E и сложность всей итерации составит &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Макроструктура алгоритма представлена на рисунке 1 (см. [[#Макроструктура алгоритма|раздел 1.4]] статьи).&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 представлена схема вычислений E-шага алгоритма для одного объекта: для объекта &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и параметров &amp;lt;math&amp;gt;w_{j}, \mu_{j}, \Sigma_{j}, j=1..k&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются ненормированные значения скрытых переменных &amp;lt;math&amp;gt;g_{j}&amp;lt;/math&amp;gt;, нормировочный коэффициент &#039;&#039;normСoeff&#039;&#039;, и получаются итоговые значения &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step.png|thumb|center|400px|Рисунок 2: E-шаг EM алгоритма для одного объекта]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 представлена схема вычислений E-шага алгоритма для всех объектов: для объекта &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt; и параметров-векторов &amp;lt;math&amp;gt;w, \mu, \Sigma&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются значения скрытых переменных. &amp;lt;math&amp;gt;E_{i}, i=1..n&amp;lt;/math&amp;gt; - маркооперации, E-шаги для соответствующих объектов.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step_all.png|thumb|center|400px|Рисунок 3: E-шаг EM алгоритма для всех объектов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена схема вычислений M-шага алгоритма для одного кластера: для объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и скрытых переменных &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;, соответствующих степени принадлежности этих объектов кластеру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, согласно формулам шага M [[#Математическое описание алгоритма|раздела 1.2]] вычисляется нормировочный коэффициент &amp;lt;math&amp;gt;N_{j}&amp;lt;/math&amp;gt; и параметры этого кластера: вес &amp;lt;math&amp;gt;w_{j}^{new}&amp;lt;/math&amp;gt;, матрица ковариации &amp;lt;math&amp;gt;\Sigma_{j}^{new}&amp;lt;/math&amp;gt; и центр кластера &amp;lt;math&amp;gt;\mu_{j}^{new}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step.png|thumb|center|400px|Рисунок 4: M-шаг EM алгоритма для одного кластера]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена схема вычислений M-шага алгоритма для всех кластеров. &amp;lt;math&amp;gt;M_{j}, j=1..k&amp;lt;/math&amp;gt; соответствует макрооперации - M-шагу для соответствующего кластера и скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step_all.png|thumb|center|400px|Рисунок 5: M-шаг EM алгоритма для всех кластеров]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Из схем вычислений шагов E и M шагов алгоритма, приведенным в [[#Информационный граф|предыдущем разделе]], видно, что если размерность матрицы ковариации небольшая (тогда вычисление определителя и обратной матрицы матрице ковариации не является трудоемкой операцией), обе макрооперации EM алгоритма можно распараллеливать как по кластерам, так и по объектам.&lt;br /&gt;
&lt;br /&gt;
Как правило количество кластеров, на которые нужно разбить объекты, несравнимо меньше количества объектов, поэтому распараллеливание в большинстве существующих реализаций происходит по объектам: обработка объектов по возможности равномерно распределяются по кластерам. Теоретически (если считать передачу данных между процессорами мгновенной) при наличии неограниченного числа процессоров сложность алгоритма составит &amp;lt;math&amp;gt;O(m^2 * k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* Целое неотрицательное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
* Значения координат объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; объектов с &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; координатами каждый.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;n * m&amp;lt;/math&amp;gt; вещественных чисел (если координаты объектов - вещественные числа), &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целое неотрицательное число.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - для каждого объекта указан номер кластера, к которому он отнесен.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; целых неотрицательных чисел. &lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
=== Преимущества и недостатки&amp;lt;ref&amp;gt;EM алгоритм, его модификации и обобщения. machinelearning.ru [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]&amp;lt;/ref&amp;gt; ===&lt;br /&gt;
EM-алгоритм обладает следующими преимуществами и недостатками:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Преимущества:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Слабо чувствителен к выбросам&lt;br /&gt;
# Прост в реализации&lt;br /&gt;
# Быстро сходится при удачном выборе начальных значений параметров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Неустойчив к выбору начальных значений параметров - от них зависит как скорость сходимости, так и результат работы: алгоритм может сойтись к локальному экстремуму функции правдоподобия, который может быть существенно ниже глобального.&lt;br /&gt;
# Алгоритм не находит оптимальное количество кластеров. Количество кластеров, на которые нужно разбить множество объектов, является параметром алгоритма.&lt;br /&gt;
# При большой размерности пространства объектов выдвинутое предположение о модели их распределения может быть некорректным.&lt;br /&gt;
&lt;br /&gt;
=== Влияние структуры матрицы ковариации на форму кластера ===&lt;br /&gt;
&lt;br /&gt;
[[file:DifferentCovariance.png|thumb|center|800px|Рисунок 6: Влияние структуры матрицы ковариации на форму кластеров для двумерного случая. a) - матрицы ковариации являются диагональными, b) - матрицы ковариации произвольны. &amp;lt;ref&amp;gt;Mathworks: Clustering Using Gaussian Mixture Models [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 6 наглядно показывает, что при диагональной форме матриц ковариации полуоси эллипса (в общем случае - эллипсоида), соответствующего распределению объектов, отнесенных кластеру, параллельны осям координат объектов. В противном случае полуоси могут располагаться произвольным образом.&lt;br /&gt;
&lt;br /&gt;
=== Общие свойства ===&lt;br /&gt;
[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] EM алгоритма равна &amp;lt;math&amp;gt;m * k * it&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - размерность объекта, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров, а &amp;lt;math&amp;gt;it&amp;lt;/math&amp;gt; - количество итераций. &lt;br /&gt;
&lt;br /&gt;
EM-алгоритм является итерационным, и число итераций в общем случае не фиксировано: оно зависит от условий остановки, начальных приближений и расположения объектов. Поэтому этот алгоритм &#039;&#039;недетерминированный&#039;&#039;. По тем же причинам EM-алгоритм является &#039;&#039;неустойчивым&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
=== Инициализация параметров распределений ===&lt;br /&gt;
Наиболее распространены 3 способа инициализации центров распределений для EM алгоритма:&lt;br /&gt;
# центр распределения совпадает со случайно выбранным объектом &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
# все наблюдения распределяются по кластерам случайным образом, а затем для каждого кластера пересчитывается цент соответствующего распределения&lt;br /&gt;
# центры кластеров получаются в результате работы алгоритма k-means. Использование такой инициализации оправдано тем, что k-means требует меньших вычислительных затрат и быстрее сходится&amp;lt;ref&amp;gt;EM алгоритм (пример) machinelearning.ru [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])&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Многие статьи&amp;lt;ref name=FREERIDE&amp;gt;Leonid Glimcher, Gagan Agrawal. Parallelising EM Algorithm on a Cluster of SMPs [http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CV&amp;gt;López-de-Teruel P. E., García J. M., Acacio; The Parallel EM Algorithm and its Applications in Computer Vision [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=MULTITHREAD&amp;gt;Sharon X. Lee, Kaleb L. Leemaqz, Geoffrey J. McLachlan. A simple multithreaded implementation of the EM algorithm for mixture models [https://arxiv.org/pdf/1606.02054.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CUDA&amp;gt;Araújo, G.F., H.T. Macedo, M.T. Chella, C.A.E. Montesco and M.V.O. Medeiros. PARALLEL IMPLEMENTATION OF EXPECTATION-MAXIMISATION ALGORITHM FOR THE TRAINING OF GAUSSIAN MIXTURE MODELS [https://ri.ufs.br/bitstream/123456789/1764/1/ExpectationMaximisationAlgorithm.pdf]&amp;lt;/ref&amp;gt;, в которых представлены параллельные реализации EM алгоритма, описывают помимо использующихся программных и аппаратных решений результаты проведенных экспериментов с данными. В качестве примера в этом разделе будут рассмотрены результаты эксперементов, проведенных со связующим программным обеспечением (&#039;&#039;middleware&#039;&#039;) FREERIDE&amp;lt;ref&amp;gt;Leonid Glimchera, Ruoming Jinb, Gagan Agrawala. Middleware for data mining applications on clusters and grids [http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf]&amp;lt;/ref&amp;gt; (FRamework for Rapid Implementation of Datamining Engines), обеспечивающим возможность распараллеливания как для систем с общей памятью (в частности, симметричных мультипроцессорных систем), так и для систем с распределенной памятью.&lt;br /&gt;
&lt;br /&gt;
Эксперименты проводились на кластере машин Pentium 700MHz связанных при помощи Myrinet&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Myrinet&amp;lt;/ref&amp;gt; LANai 7.0 на трех наборах данных: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;а)&#039;&#039;&#039; 3.3 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; 6.2 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; 12.5 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
Объекты представляют собой координаты точек 10-мерного пространства.&lt;br /&gt;
 &lt;br /&gt;
Количество машин в кластере варьировалось от 1 до 8, при этом на каждой машине запускалось до четырех параллельных потоков.&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов представлены на рисунках 7-9&amp;lt;ref name=FREERIDE/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_a.png|thumb|center|350px|Рисунок 7: набор данных a)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_b.png|thumb|center|357px|Рисунок 8: набор данных b)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_c.png|thumb|center|351px|Рисунок 9: набор данных c)]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что используемые в данном исследовании машины, как и коммуникационная среда, сейчас не используются и считаются устаревшими, результат приведенных экспериментов наглядно показывает, что EM алгоритм хорошо параллелится, зависимость ускорения от числа узлов в кластере с небольшим количеством узлов близка к линейной, а также, что скорость работы алгоритма линейно зависит от числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Данный раздел может быть дополнен&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Примеры библиотек, содержащих последовательную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV(C++)] ([https://github.com/opencv/opencv/blob/master/modules/ml/src/em.cpp github])&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab]&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html Scikit learn (Python)]&lt;br /&gt;
# [http://mlpack.org/index.html MLPack(C++)]&lt;br /&gt;
&lt;br /&gt;
Примеры библиотек, содержащих параллельную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Здесь приводятся как конкретные реализации, так и статьи, описывающие подходы к реализациям распараллеливания EM-алгоритма&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# [https://spark.apache.org/ Apache Spark]&lt;br /&gt;
# [http://accord-framework.net/ Accord.NET Framework (C#)]&lt;br /&gt;
# Статья об использовании FREERIDE middleware для распараллеливания EM алгоритма &amp;lt;ref name=FREERIDE/&amp;gt; &lt;br /&gt;
# [http://andrewharp.com/gmmcuda реализация с использованием CUDA]&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MPI еще одна реализация с использованием CUDA]&lt;br /&gt;
# статья об использовании параллельного EM алгоритма в задачах компьютерного зрения &amp;lt;ref name=CV/&amp;gt;&lt;br /&gt;
# статья о распараллеливании EM алгоритма с использованием CUDA &amp;lt;ref name=CUDA/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Noite</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:Noite/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=6847</id>
		<title>Участник:Noite/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:Noite/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=6847"/>
		<updated>2016-10-13T19:59:13Z</updated>

		<summary type="html">&lt;p&gt;Noite: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n * m^2 * k)&amp;lt;/math&amp;gt; - одна итерация&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n * m + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{assignment}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Noite|Зинченко Д.А.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм кластеризации, основанный на максимизации ожидания (EM-алгоритм) &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
В задачах оптимизации EM-алгоритмом называют итеративную процедуру поиска численного значения экстремума какой-либо функции. В частности, в статистике этот алгоритм используется для оценки максимального правдоподобия. Впервые название EM-алгоритм было предложено в 1977 году&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;, однако его идеи были описаны и раньше&amp;lt;ref name=korolev&amp;gt;В.Ю.Королёв. ЕМ-алгоритм, его модификации и их применение к задаче разделения смесей вероятностных распределений.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм применяется для решения задач двух типов &amp;lt;ref name=korolev/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Анализ неполных данных (данных с пропусками). &lt;br /&gt;
# Оценка максимального правдоподобия в случае, если функцию правдоподобия трудно исследовать аналитически. В этом случае введение набора скрытых переменных может существенно упростить задачу.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к задачам второго типа. В данной статье рассматривается следующая постановка задачи кластеризации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;Дано множество объектов, каждый из которых представляет собой точку в n-мерном метрическом пространстве. Каждому измерению пространства соответствует некоторое свойство объекта. Необходимо разбить это множество на k подмножеств так, чтобы, чтобы элементы каждого подмножества существенно отличались по свойствам от элементов других подмножеств.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование алгоритма EM подразумевает следующее &#039;&#039;предположение об объектах&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Пусть объекты, которые необходимо разбить на кластеры, появляются случайным образом и независимо друг от друга согласно вероятностному распределению, равному смеси (линейной комбинации) распределений кластеров. В данной статье в дальнейшем будет считаться, что распределение каждого кластера является многомерным нормальным распределением с произвольной матрицей ковариации - наиболее часто используемое предположение.&lt;br /&gt;
&lt;br /&gt;
Тогда каждый объект принадлежит каждому кластеру, но с разной вероятностью. EM-алгоритм итеративно оценивает параметры распределений кластеров, максимизируя логарифмическую функцию максимального правдоподобия. После окончания работы алгоритма объект будет отнесен к кластеру, вероятность принадлежности которому максимальна. Вводимый набор скрытых переменных для каждого объекта - вероятности того, что объект принадлежит каждому из кластеров.&lt;br /&gt;
&lt;br /&gt;
Итерация алгоритма состоит из двух последовательных шагов.&lt;br /&gt;
&lt;br /&gt;
# (Expectation) Вычисляются новые ожидаемые значения скрытых переменных.&lt;br /&gt;
# (Maximization) Решается задача максимизации правдоподобия: По текущим значениям скрытых переменных обновляются параметры распределений для кластеров: математическое ожидание, дисперсия и вероятность появления объектов из кластера.&lt;br /&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;N&amp;lt;/math&amp;gt; - количество объектов, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - количество параметров объекта&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\gamma_{n,k}&amp;lt;/math&amp;gt; - значения скрытых переменных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N_{k}&amp;lt;/math&amp;gt; - количество элементов отнесенных к соответствующему кластеру&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{1},...,x_n&amp;lt;/math&amp;gt; - объекты&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Параметры распределений:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{1},...,w_{k}&amp;lt;/math&amp;gt; - вероятности появления объектов из кластеров (веса кластеров), &amp;lt;math&amp;gt;\sum_{k=1}^Kw_{k}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{1},...,\mu_{k}&amp;lt;/math&amp;gt; - центры гауссиан кластеров&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma_{1},...,\Sigma_{k}&amp;lt;/math&amp;gt; - матрицы ковариации гауссиан кластеров, каждая матрица имеет размерность &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Смесь распределений:&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; P(x) = \sum_{j=1}^Kw_jp(x|\mu_{j}, \Sigma_{j})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Цель алгоритма - вычислить параметры распределений, максимизирующих логарифм функции правдоподобия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\ln P(x|w,\mu,\Sigma)= \sum_{n=1}^N \ln \{ \sum_{k=1}^K w_{k}p(x_{n}|\mu_{k},\Sigma_{k})\}&amp;lt;/math&amp;gt;.&amp;lt;/center&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
* В начале работы алгоритма задаются параметры начального приближения:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{i} = 1/K, \mu_{i} = random(x_{j}), i=1..K, j=1..N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{j,j}^{k}=\frac{1}{NK}\sum_{i=1}^N(x_{i,j} - \mu_{k,j})^2, k=1..K, j=1..M&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Поскольку от начального приближения может сильно зависеть результат работы алгоритма, вместо инициализации кластеров случайными центрами, равными весами и диагональными матрицами ковариации, как в приведенных формулах, часто применяют другие способы (подробнее - в [[#Особенности реализации последовательного алгоритма | особенностях реализации]])&#039;&#039;&lt;br /&gt;
* Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
** E-шаг: используя текущее значение параметров &amp;lt;math&amp;gt;w_{1},...,w_{k};\mu_{1},...,\mu_{k};\Sigma^{1},...,\Sigma^{k}&amp;lt;/math&amp;gt;, вычисляем значение вектора скрытых переменных &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\gamma_{n,k}=\frac{w_{k}p(x_{n}|\mu_{k},\Sigma^{k})}{\sum_{j=1}^K w_{j}p(x_{n}|\mu_{j},\Sigma^{j})}, &amp;lt;/math&amp;gt; знаменатель дроби - нормировочный коэффициент&amp;lt;/center&amp;gt;&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p(x|\mu,\Sigma)=\frac{1}{{(2\pi)}^{\frac{N}{2}}\sqrt{|\Sigma|}}exp\biggl\{-\frac{1}{2}{(x-\mu)}^T{\Sigma}^{-1}(x-\mu)\biggr\}&amp;lt;/math&amp;gt; - плотность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерного нормального распределения&amp;lt;/center&amp;gt;&lt;br /&gt;
** М-шаг: переоценка параметров по текущим значениям скрытых переменных для &amp;lt;math&amp;gt;k = 1..K&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\mu^{new}_{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k}x_{n}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{new}^{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k} (x_{n}-\mu_{k}^{new})(x_{n}-\mu_{k}^{new})^{T}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{k}^{new}=\frac{N_{k}}{N}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;N_{k}=\sum_{n=1}^N \gamma_{n,k}&amp;lt;/math&amp;gt;.&amp;lt;/center&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;
Вычислительное ядро алгоритма состоит из двух шагов, повторяющихся каждую итерацию:&lt;br /&gt;
*Обновление скрытых переменных на основе текущих параметров распределений&lt;br /&gt;
*Обновление параметров кластеров: весов, центров и матриц ковариации&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании вычислительного ядра алгоритма]], основную часть алгоритма составляют итеративно проводимые макрооперации: Expectation шаг - вычисление новых значений скрытых переменных, Maximization шаг - обновление параметров кластеров. Макроструктура алгоритма представлена на рисунке 1:&lt;br /&gt;
[[file:EM_macro.png|thumb|center|600px|Рисунок 1: Макроструктура EM-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Примерная схема реализации EM алгоритма с предварительной обработкой матриц ковариации:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
// n - количество объектов&lt;br /&gt;
&lt;br /&gt;
// m - количество координат объектов&lt;br /&gt;
&lt;br /&gt;
// k - количество кластеров&lt;br /&gt;
&lt;br /&gt;
Инициализировать веса и центры кластеров;&lt;br /&gt;
Инициализировать матрицы ковариации;&lt;br /&gt;
&lt;br /&gt;
// Основной цикл&lt;br /&gt;
Пока условие остановки не выполнено&lt;br /&gt;
    // E-шаг&lt;br /&gt;
    В цикле для каждого кластера&lt;br /&gt;
        Вычислить определитель матрицы ковариации Sigma;&lt;br /&gt;
        Вычислить обратную матрицу матрице Sigma;&lt;br /&gt;
    В цикле для каждого объекта&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Вычислить и запомнить p(x | mu, Sigma) для текущего объекта и кластера;&lt;br /&gt;
            Просуммировать вычисленные p(x | mu, Sigma);&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Обновить скрытые переменные gamma;&lt;br /&gt;
    // M-шаг&lt;br /&gt;
    Обновить веса w;&lt;br /&gt;
    Обновить центры кластеров mu;&lt;br /&gt;
    Обновить матрицы ковариации Sigma;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления определителя произвольной матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления матрицы, обратной произвольной матрице ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации - &amp;lt;math&amp;gt;O(k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С учетом заранее вычисленных определителей и обратных матриц сложность вычисления &amp;lt;math&amp;gt;p(x | \mu,\Sigma)&amp;lt;/math&amp;gt; составит: &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага E составит &amp;lt;math&amp;gt;O(n * m^2 * k + k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления весов кластеров &amp;lt;math&amp;gt;O(k * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления центров кластеров &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления одной матрицы ковариации &amp;lt;math&amp;gt;O(n * m)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления всех матриц ковариации &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага M алгоритма - &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит &amp;lt;math&amp;gt;O(k * m^2 * n + k * m^3 + k * m * n)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В предположении, что размерность объектов много меньше их количества &amp;lt;math&amp;gt;m &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt; получим сложность итерации &amp;lt;math&amp;gt;O(k * m^2 * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большУю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее - вынесены за основной цикл шага E&amp;lt;ref name=ParallelEMComparissonGraphLab&amp;gt;Henggang Cui, Jinliang Wei, Wei Dai. Parallel Implementation of Expectation-Maximization for Fast Convergence - School of Computer Science, Carnegie Mellon University. [https://users.ece.cmu.edu/~hengganc/archive/report/final.pdf]&amp;lt;/ref&amp;gt;. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм&amp;lt;ref&amp;gt;Вячеслав Орешков. EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, а суммарная сложность шага E и сложность всей итерации составит &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Макроструктура алгоритма представлена на рисунке 1 (см. [[#Макроструктура алгоритма|раздел 1.4]] статьи).&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 представлена схема вычислений E-шага алгоритма для одного объекта: для объекта &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и параметров &amp;lt;math&amp;gt;w_{j}, \mu_{j}, \Sigma_{j}, j=1..k&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются ненормированные значения скрытых переменных &amp;lt;math&amp;gt;g_{j}&amp;lt;/math&amp;gt;, нормировочный коэффициент &#039;&#039;normСoeff&#039;&#039;, и получаются итоговые значения &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step.png|thumb|center|400px|Рисунок 2: E-шаг EM алгоритма для одного объекта]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 представлена схема вычислений E-шага алгоритма для всех объектов: для объекта &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt; и параметров-векторов &amp;lt;math&amp;gt;w, \mu, \Sigma&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются значения скрытых переменных. &amp;lt;math&amp;gt;E_{i}, i=1..n&amp;lt;/math&amp;gt; - маркооперации, E-шаги для соответствующих объектов.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step_all.png|thumb|center|400px|Рисунок 3: E-шаг EM алгоритма для всех объектов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена схема вычислений M-шага алгоритма для одного кластера: для объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и скрытых переменных &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;, соответствующих степени принадлежности этих объектов кластеру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, согласно формулам шага M [[#Математическое описание алгоритма|раздела 1.2]] вычисляется нормировочный коэффициент &amp;lt;math&amp;gt;N_{j}&amp;lt;/math&amp;gt; и параметры этого кластера: вес &amp;lt;math&amp;gt;w_{j}^{new}&amp;lt;/math&amp;gt;, матрица ковариации &amp;lt;math&amp;gt;\Sigma_{j}^{new}&amp;lt;/math&amp;gt; и центр кластера &amp;lt;math&amp;gt;\mu_{j}^{new}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step.png|thumb|center|400px|Рисунок 4: M-шаг EM алгоритма для одного кластера]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена схема вычислений M-шага алгоритма для всех кластеров. &amp;lt;math&amp;gt;M_{j}, j=1..k&amp;lt;/math&amp;gt; соответствует макрооперации - M-шагу для соответствующего кластера и скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step_all.png|thumb|center|400px|Рисунок 5: M-шаг EM алгоритма для всех кластеров]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Из схем вычислений шагов E и M шагов алгоритма, приведенным в [[#Информационный граф|предыдущем разделе]], видно, что если размерность матрицы ковариации небольшая (тогда вычисление определителя и обратной матрицы матрице ковариации не является трудоемкой операцией), обе макрооперации EM алгоритма можно распараллеливать как по кластерам, так и по объектам.&lt;br /&gt;
&lt;br /&gt;
Как правило количество кластеров, на которые нужно разбить объекты, несравнимо меньше количества объектов, поэтому распараллеливание в большинстве существующих реализаций происходит по объектам: обработка объектов по возможности равномерно распределяются по кластерам. Теоретически (если считать передачу данных между процессорами мгновенной) при наличии неограниченного числа процессоров сложность алгоритма составит &amp;lt;math&amp;gt;O(m^2 * k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* Целое неотрицательное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
* Значения координат объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; объектов с &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; координатами каждый.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;n * m&amp;lt;/math&amp;gt; вещественных чисел (если координаты объектов - вещественные числа), &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целое неотрицательное число.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - для каждого объекта указан номер кластера, к которому он отнесен.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; целых неотрицательных чисел. &lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
=== Преимущества и недостатки&amp;lt;ref&amp;gt;EM алгоритм, его модификации и обобщения. machinelearning.ru [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]&amp;lt;/ref&amp;gt; ===&lt;br /&gt;
EM-алгоритм обладает следующими преимуществами и недостатками:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Преимущества:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Слабо чувствителен к выбросам&lt;br /&gt;
# Прост в реализации&lt;br /&gt;
# Быстро сходится при удачном выборе начальных значений параметров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Неустойчив к выбору начальных значений параметров - от них зависит как скорость сходимости, так и результат работы: алгоритм может сойтись к локальному экстремуму функции правдоподобия, который может быть существенно ниже глобального.&lt;br /&gt;
# Алгоритм не находит оптимальное количество кластеров. Количество кластеров, на которые нужно разбить множество объектов, является параметром алгоритма.&lt;br /&gt;
# При большой размерности пространства объектов выдвинутое предположение о модели их распределения может быть некорректным.&lt;br /&gt;
&lt;br /&gt;
=== Влияние структуры матрицы ковариации на форму кластера ===&lt;br /&gt;
&lt;br /&gt;
[[file:DifferentCovariance.png|thumb|center|800px|Рисунок 6: Влияние структуры матрицы ковариации на форму кластеров для двумерного случая. a) - матрицы ковариации являются диагональными, b) - матрицы ковариации произвольны. &amp;lt;ref&amp;gt;Mathworks: Clustering Using Gaussian Mixture Models [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 6 наглядно показывает, что при диагональной форме матриц ковариации полуоси эллипса (в общем случае - эллипсоида), соответствующего распределению объектов, отнесенных кластеру, параллельны осям координат объектов. В противном случае полуоси могут располагаться произвольным образом.&lt;br /&gt;
&lt;br /&gt;
=== Общие свойства ===&lt;br /&gt;
[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] EM алгоритма равна &amp;lt;math&amp;gt;m * k * it&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - размерность объекта, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров, а &amp;lt;math&amp;gt;it&amp;lt;/math&amp;gt; - количество итераций. &lt;br /&gt;
&lt;br /&gt;
EM-алгоритм является итерационным, и число итераций в общем случае не фиксировано: оно зависит от условий остановки, начальных приближений и расположения объектов. Поэтому этот алгоритм &#039;&#039;недетерминированный&#039;&#039;. По тем же причинам EM-алгоритм является &#039;&#039;неустойчивым&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
=== Инициализация параметров распределений ===&lt;br /&gt;
Наиболее распространены 3 способа инициализации центров распределений для EM алгоритма:&lt;br /&gt;
# центр распределения совпадает со случайно выбранным объектом &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
# все наблюдения распределяются по кластерам случайным образом, а затем для каждого кластера пересчитывается цент соответствующего распределения&lt;br /&gt;
# центры кластеров получаются в результате работы алгоритма k-means. Использование такой инициализации оправдано тем, что k-means требует меньших вычислительных затрат и быстрее сходится&amp;lt;ref&amp;gt;EM алгоритм (пример) machinelearning.ru [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])&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Многие статьи&amp;lt;ref name=FREERIDE&amp;gt;Leonid Glimcher, Gagan Agrawal. Parallelising EM Algorithm on a Cluster of SMPs [http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CV&amp;gt;López-de-Teruel P. E., García J. M., Acacio; The Parallel EM Algorithm and its Applications in Computer Vision [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=MULTITHREAD&amp;gt;Sharon X. Lee, Kaleb L. Leemaqz, Geoffrey J. McLachlan. A simple multithreaded implementation of the EM algorithm for mixture models [https://arxiv.org/pdf/1606.02054.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CUDA&amp;gt;Araújo, G.F., H.T. Macedo, M.T. Chella, C.A.E. Montesco and M.V.O. Medeiros. PARALLEL IMPLEMENTATION OF EXPECTATION-MAXIMISATION ALGORITHM FOR THE TRAINING OF GAUSSIAN MIXTURE MODELS [https://ri.ufs.br/bitstream/123456789/1764/1/ExpectationMaximisationAlgorithm.pdf]&amp;lt;/ref&amp;gt;, в которых представлены параллельные реализации EM алгоритма, описывают помимо использующихся программных и аппаратных решений результаты проведенных экспериментов с данными. В качестве примера в этом разделе будут рассмотрены результаты эксперементов, проведенных со связующим программным обеспечением (&#039;&#039;middleware&#039;&#039;) FREERIDE&amp;lt;ref&amp;gt;Leonid Glimchera, Ruoming Jinb, Gagan Agrawala. Middleware for data mining applications on clusters and grids [http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf]&amp;lt;/ref&amp;gt; (FRamework for Rapid Implementation of Datamining Engines), обеспечивающим возможность распараллеливания как для систем с общей памятью (в частности, симметричных мультипроцессорных систем), так и для систем с распределенной памятью.&lt;br /&gt;
&lt;br /&gt;
Эксперименты проводились на кластере машин Pentium 700MHz связанных при помощи Myrinet&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Myrinet&amp;lt;/ref&amp;gt; LANai 7.0 на трех наборах данных: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;а)&#039;&#039;&#039; 3.3 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; 6.2 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; 12.5 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
Объекты представляют собой координаты точек 10-мерного пространства.&lt;br /&gt;
 &lt;br /&gt;
Количество машин в кластере варьировалось от 1 до 8, при этом на каждой машине запускалось до четырех параллельных потоков.&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов представлены на рисунках 7-9&amp;lt;ref name=FREERIDE/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_a.png|thumb|center|350px|Рисунок 7: набор данных a)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_b.png|thumb|center|357px|Рисунок 8: набор данных b)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_c.png|thumb|center|351px|Рисунок 9: набор данных c)]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что используемые в данном исследовании машины, как и коммуникационная среда, сейчас не используются и считаются устаревшими, результат приведенных экспериментов наглядно показывает, что EM алгоритм хорошо параллелится, зависимость ускорения от числа узлов в кластере с небольшим количеством узлов близка к линейной, а также, что скорость работы алгоритма линейно зависит от числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Данный раздел может быть дополнен&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Примеры библиотек, содержащих последовательную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV(C++)] ([https://github.com/opencv/opencv/blob/master/modules/ml/src/em.cpp github])&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab]&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html Scikit learn (Python)]&lt;br /&gt;
# [http://mlpack.org/index.html MLPack(C++)]&lt;br /&gt;
&lt;br /&gt;
Примеры библиотек, содержащих параллельную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Здесь приводятся как конкретные реализации, так и статьи, описывающие подходы к реализациям распараллеливания EM-алгоритма&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# [https://spark.apache.org/ Apache Spark]&lt;br /&gt;
# [http://accord-framework.net/ Accord.NET Framework (C#)]&lt;br /&gt;
# Статья об использовании FREERIDE middleware для распараллеливания EM алгоритма &amp;lt;ref name=FREERIDE/&amp;gt; &lt;br /&gt;
# [http://andrewharp.com/gmmcuda реализация с использованием CUDA]&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MPI еще одна реализация с использованием CUDA]&lt;br /&gt;
# статья об использовании параллельного EM алгоритма в задачах компьютерного зрения &amp;lt;ref name=CV/&amp;gt;&lt;br /&gt;
# статья о распараллеливании EM алгоритма с использованием CUDA &amp;lt;ref name=CUDA/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Noite</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:Noite/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=6845</id>
		<title>Участник:Noite/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:Noite/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=6845"/>
		<updated>2016-10-13T19:58:54Z</updated>

		<summary type="html">&lt;p&gt;Noite: /* Преимущества и недостатки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n * m^2 * k)&amp;lt;/math&amp;gt; - одна итерация&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n * m + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{assignment}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Noite|Зинченко Д.А.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм кластеризации, основанный на максимизации ожидания (EM-алгоритм) &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
В задачах оптимизации EM-алгоритмом называют итеративную процедуру поиска численного значения экстремума какой-либо функции. В частности, в статистике этот алгоритм используется для оценки максимального правдоподобия. Впервые название EM-алгоритм было предложено в 1977 году&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;, однако его идеи были описаны и раньше&amp;lt;ref name=korolev&amp;gt;В.Ю.Королёв. ЕМ-алгоритм, его модификации и их применение к задаче разделения смесей вероятностных распределений.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм применяется для решения задач двух типов &amp;lt;ref name=korolev/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Анализ неполных данных (данных с пропусками). &lt;br /&gt;
# Оценка максимального правдоподобия в случае, если функцию правдоподобия трудно исследовать аналитически. В этом случае введение набора скрытых переменных может существенно упростить задачу.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к задачам второго типа. В данной статье рассматривается следующая постановка задачи кластеризации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;Дано множество объектов, каждый из которых представляет собой точку в n-мерном метрическом пространстве. Каждому измерению пространства соответствует некоторое свойство объекта. Необходимо разбить это множество на k подмножеств так, чтобы, чтобы элементы каждого подмножества существенно отличались по свойствам от элементов других подмножеств.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование алгоритма EM подразумевает следующее &#039;&#039;предположение об объектах&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Пусть объекты, которые необходимо разбить на кластеры, появляются случайным образом и независимо друг от друга согласно вероятностному распределению, равному смеси (линейной комбинации) распределений кластеров. В данной статье в дальнейшем будет считаться, что распределение каждого кластера является многомерным нормальным распределением с произвольной матрицей ковариации - наиболее часто используемое предположение.&lt;br /&gt;
&lt;br /&gt;
Тогда каждый объект принадлежит каждому кластеру, но с разной вероятностью. EM-алгоритм итеративно оценивает параметры распределений кластеров, максимизируя логарифмическую функцию максимального правдоподобия. После окончания работы алгоритма объект будет отнесен к кластеру, вероятность принадлежности которому максимальна. Вводимый набор скрытых переменных для каждого объекта - вероятности того, что объект принадлежит каждому из кластеров.&lt;br /&gt;
&lt;br /&gt;
Итерация алгоритма состоит из двух последовательных шагов.&lt;br /&gt;
&lt;br /&gt;
# (Expectation) Вычисляются новые ожидаемые значения скрытых переменных.&lt;br /&gt;
# (Maximization) Решается задача максимизации правдоподобия: По текущим значениям скрытых переменных обновляются параметры распределений для кластеров: математическое ожидание, дисперсия и вероятность появления объектов из кластера.&lt;br /&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;N&amp;lt;/math&amp;gt; - количество объектов, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - количество параметров объекта&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\gamma_{n,k}&amp;lt;/math&amp;gt; - значения скрытых переменных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N_{k}&amp;lt;/math&amp;gt; - количество элементов отнесенных к соответствующему кластеру&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{1},...,x_n&amp;lt;/math&amp;gt; - объекты&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Параметры распределений:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{1},...,w_{k}&amp;lt;/math&amp;gt; - вероятности появления объектов из кластеров (веса кластеров), &amp;lt;math&amp;gt;\sum_{k=1}^Kw_{k}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{1},...,\mu_{k}&amp;lt;/math&amp;gt; - центры гауссиан кластеров&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma_{1},...,\Sigma_{k}&amp;lt;/math&amp;gt; - матрицы ковариации гауссиан кластеров, каждая матрица имеет размерность &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Смесь распределений:&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; P(x) = \sum_{j=1}^Kw_jp(x|\mu_{j}, \Sigma_{j})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Цель алгоритма - вычислить параметры распределений, максимизирующих логарифм функции правдоподобия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\ln P(x|w,\mu,\Sigma)= \sum_{n=1}^N \ln \{ \sum_{k=1}^K w_{k}p(x_{n}|\mu_{k},\Sigma_{k})\}&amp;lt;/math&amp;gt;.&amp;lt;/center&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
* В начале работы алгоритма задаются параметры начального приближения:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{i} = 1/K, \mu_{i} = random(x_{j}), i=1..K, j=1..N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{j,j}^{k}=\frac{1}{NK}\sum_{i=1}^N(x_{i,j} - \mu_{k,j})^2, k=1..K, j=1..M&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Поскольку от начального приближения может сильно зависеть результат работы алгоритма, вместо инициализации кластеров случайными центрами, равными весами и диагональными матрицами ковариации, как в приведенных формулах, часто применяют другие способы (подробнее - в [[#Особенности реализации последовательного алгоритма | особенностях реализации]])&#039;&#039;&lt;br /&gt;
* Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
** E-шаг: используя текущее значение параметров &amp;lt;math&amp;gt;w_{1},...,w_{k};\mu_{1},...,\mu_{k};\Sigma^{1},...,\Sigma^{k}&amp;lt;/math&amp;gt;, вычисляем значение вектора скрытых переменных &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\gamma_{n,k}=\frac{w_{k}p(x_{n}|\mu_{k},\Sigma^{k})}{\sum_{j=1}^K w_{j}p(x_{n}|\mu_{j},\Sigma^{j})}, &amp;lt;/math&amp;gt; знаменатель дроби - нормировочный коэффициент&amp;lt;/center&amp;gt;&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p(x|\mu,\Sigma)=\frac{1}{{(2\pi)}^{\frac{N}{2}}\sqrt{|\Sigma|}}exp\biggl\{-\frac{1}{2}{(x-\mu)}^T{\Sigma}^{-1}(x-\mu)\biggr\}&amp;lt;/math&amp;gt; - плотность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерного нормального распределения&amp;lt;/center&amp;gt;&lt;br /&gt;
** М-шаг: переоценка параметров по текущим значениям скрытых переменных для &amp;lt;math&amp;gt;k = 1..K&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\mu^{new}_{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k}x_{n}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{new}^{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k} (x_{n}-\mu_{k}^{new})(x_{n}-\mu_{k}^{new})^{T}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{k}^{new}=\frac{N_{k}}{N}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;N_{k}=\sum_{n=1}^N \gamma_{n,k}&amp;lt;/math&amp;gt;.&amp;lt;/center&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;
Вычислительное ядро алгоритма состоит из двух шагов, повторяющихся каждую итерацию:&lt;br /&gt;
*Обновление скрытых переменных на основе текущих параметров распределений&lt;br /&gt;
*Обновление параметров кластеров: весов, центров и матриц ковариации&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании вычислительного ядра алгоритма]], основную часть алгоритма составляют итеративно проводимые макрооперации: Expectation шаг - вычисление новых значений скрытых переменных, Maximization шаг - обновление параметров кластеров. Макроструктура алгоритма представлена на рисунке 1:&lt;br /&gt;
[[file:EM_macro.png|thumb|center|600px|Рисунок 1: Макроструктура EM-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Примерная схема реализации EM алгоритма с предварительной обработкой матриц ковариации:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
// n - количество объектов&lt;br /&gt;
&lt;br /&gt;
// m - количество координат объектов&lt;br /&gt;
&lt;br /&gt;
// k - количество кластеров&lt;br /&gt;
&lt;br /&gt;
Инициализировать веса и центры кластеров;&lt;br /&gt;
Инициализировать матрицы ковариации;&lt;br /&gt;
&lt;br /&gt;
// Основной цикл&lt;br /&gt;
Пока условие остановки не выполнено&lt;br /&gt;
    // E-шаг&lt;br /&gt;
    В цикле для каждого кластера&lt;br /&gt;
        Вычислить определитель матрицы ковариации Sigma;&lt;br /&gt;
        Вычислить обратную матрицу матрице Sigma;&lt;br /&gt;
    В цикле для каждого объекта&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Вычислить и запомнить p(x | mu, Sigma) для текущего объекта и кластера;&lt;br /&gt;
            Просуммировать вычисленные p(x | mu, Sigma);&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Обновить скрытые переменные gamma;&lt;br /&gt;
    // M-шаг&lt;br /&gt;
    Обновить веса w;&lt;br /&gt;
    Обновить центры кластеров mu;&lt;br /&gt;
    Обновить матрицы ковариации Sigma;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления определителя произвольной матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления матрицы, обратной произвольной матрице ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации - &amp;lt;math&amp;gt;O(k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С учетом заранее вычисленных определителей и обратных матриц сложность вычисления &amp;lt;math&amp;gt;p(x | \mu,\Sigma)&amp;lt;/math&amp;gt; составит: &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага E составит &amp;lt;math&amp;gt;O(n * m^2 * k + k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления весов кластеров &amp;lt;math&amp;gt;O(k * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления центров кластеров &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления одной матрицы ковариации &amp;lt;math&amp;gt;O(n * m)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления всех матриц ковариации &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага M алгоритма - &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит &amp;lt;math&amp;gt;O(k * m^2 * n + k * m^3 + k * m * n)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В предположении, что размерность объектов много меньше их количества &amp;lt;math&amp;gt;m &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt; получим сложность итерации &amp;lt;math&amp;gt;O(k * m^2 * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большУю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее - вынесены за основной цикл шага E&amp;lt;ref name=ParallelEMComparissonGraphLab&amp;gt;Henggang Cui, Jinliang Wei, Wei Dai. Parallel Implementation of Expectation-Maximization for Fast Convergence - School of Computer Science, Carnegie Mellon University. [https://users.ece.cmu.edu/~hengganc/archive/report/final.pdf]&amp;lt;/ref&amp;gt;. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм&amp;lt;ref&amp;gt;Вячеслав Орешков. EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, а суммарная сложность шага E и сложность всей итерации составит &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Макроструктура алгоритма представлена на рисунке 1 (см. [[#Макроструктура алгоритма|раздел 1.4]] статьи).&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 представлена схема вычислений E-шага алгоритма для одного объекта: для объекта &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и параметров &amp;lt;math&amp;gt;w_{j}, \mu_{j}, \Sigma_{j}, j=1..k&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются ненормированные значения скрытых переменных &amp;lt;math&amp;gt;g_{j}&amp;lt;/math&amp;gt;, нормировочный коэффициент &#039;&#039;normСoeff&#039;&#039;, и получаются итоговые значения &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step.png|thumb|center|400px|Рисунок 2: E-шаг EM алгоритма для одного объекта]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 представлена схема вычислений E-шага алгоритма для всех объектов: для объекта &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt; и параметров-векторов &amp;lt;math&amp;gt;w, \mu, \Sigma&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются значения скрытых переменных. &amp;lt;math&amp;gt;E_{i}, i=1..n&amp;lt;/math&amp;gt; - маркооперации, E-шаги для соответствующих объектов.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step_all.png|thumb|center|400px|Рисунок 3: E-шаг EM алгоритма для всех объектов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена схема вычислений M-шага алгоритма для одного кластера: для объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и скрытых переменных &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;, соответствующих степени принадлежности этих объектов кластеру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, согласно формулам шага M [[#Математическое описание алгоритма|раздела 1.2]] вычисляется нормировочный коэффициент &amp;lt;math&amp;gt;N_{j}&amp;lt;/math&amp;gt; и параметры этого кластера: вес &amp;lt;math&amp;gt;w_{j}^{new}&amp;lt;/math&amp;gt;, матрица ковариации &amp;lt;math&amp;gt;\Sigma_{j}^{new}&amp;lt;/math&amp;gt; и центр кластера &amp;lt;math&amp;gt;\mu_{j}^{new}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step.png|thumb|center|400px|Рисунок 4: M-шаг EM алгоритма для одного кластера]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена схема вычислений M-шага алгоритма для всех кластеров. &amp;lt;math&amp;gt;M_{j}, j=1..k&amp;lt;/math&amp;gt; соответствует макрооперации - M-шагу для соответствующего кластера и скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step_all.png|thumb|center|400px|Рисунок 5: M-шаг EM алгоритма для всех кластеров]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Из схем вычислений шагов E и M шагов алгоритма, приведенным в [[#Информационный граф|предыдущем разделе]], видно, что если размерность матрицы ковариации небольшая (тогда вычисление определителя и обратной матрицы матрице ковариации не является трудоемкой операцией), обе макрооперации EM алгоритма можно распараллеливать как по кластерам, так и по объектам.&lt;br /&gt;
&lt;br /&gt;
Как правило количество кластеров, на которые нужно разбить объекты, несравнимо меньше количества объектов, поэтому распараллеливание в большинстве существующих реализаций происходит по объектам: обработка объектов по возможности равномерно распределяются по кластерам. Теоретически (если считать передачу данных между процессорами мгновенной) при наличии неограниченного числа процессоров сложность алгоритма составит &amp;lt;math&amp;gt;O(m^2 * k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* Целое неотрицательное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
* Значения координат объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; объектов с &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; координатами каждый.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;n * m&amp;lt;/math&amp;gt; вещественных чисел (если координаты объектов - вещественные числа), &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целое неотрицательное число.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - для каждого объекта указан номер кластера, к которому он отнесен.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; целых неотрицательных чисел. &lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
=== Преимущества и недостатки&amp;lt;ref&amp;gt;EM алгоритм, его модификации и обобщения. machinelearning.ru [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]&amp;lt;/ref&amp;gt; ===&lt;br /&gt;
EM-алгоритм обладает следующими преимуществами и недостатками:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Преимущества:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Слабо чувствителен к выбросам&lt;br /&gt;
# Прост в реализации&lt;br /&gt;
# Быстро сходится при удачном выборе начальных значений параметров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Неустойчив к выбору начальных значений параметров - от них зависит как скорость сходимости, так и результат работы: алгоритм может сойтись к локальному экстремуму функции правдоподобия, который может быть существенно ниже глобального.&lt;br /&gt;
# Алгоритм не находит оптимальное количество кластеров. Количество кластеров, на которые нужно разбить множество объектов, является параметром алгоритма.&lt;br /&gt;
# При большой размерности пространства объектов выдвинутое предположение о модели их распределения может быть некорректным.&lt;br /&gt;
&lt;br /&gt;
=== Влияние структуры матрицы ковариации на форму кластера ===&lt;br /&gt;
&lt;br /&gt;
[[file:DifferentCovariance.png|thumb|center|800px|Рисунок 6: Влияние структуры матрицы ковариации на форму кластеров для двумерного случая. a) - матрицы ковариации являются диагональными, b) - матрицы ковариации произвольны. &amp;lt;ref&amp;gt;Mathworks: Clustering Using Gaussian Mixture Models [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 6 наглядно показывает, что при диагональной форме матриц ковариации полуоси эллипса (в общем случае - эллипсоида), соответствующего распределению объектов, отнесенных кластеру, параллельны осям координат объектов. В противном случае полуоси могут располагаться произвольным образом.&lt;br /&gt;
&lt;br /&gt;
=== Общие свойства ===&lt;br /&gt;
[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] EM алгоритма равна &amp;lt;math&amp;gt;m * k * it&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - размерность объекта, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров, а &amp;lt;math&amp;gt;it&amp;lt;/math&amp;gt; - количество итераций. &lt;br /&gt;
&lt;br /&gt;
EM-алгоритм является итерационным, и число итераций в общем случае не фиксировано: оно зависит от условий остановки, начальных приближений и расположения объектов. Поэтому этот алгоритм &#039;&#039;недетерминированный&#039;&#039;. По тем же причинам EM-алгоритм является &#039;&#039;неустойчивым&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
=== Инициализация параметров распределений ===&lt;br /&gt;
Наиболее распространены 3 способа инициализации центров распределений для EM алгоритма:&lt;br /&gt;
# центр распределения совпадает со случайно выбранным объектом &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
# все наблюдения распределяются по кластерам случайным образом, а затем для каждого кластера пересчитывается цент соответствующего распределения&lt;br /&gt;
# центры кластеров получаются в результате работы алгоритма k-means. Использование такой инициализации оправдано тем, что k-means требует меньших вычислительных затрат и быстрее сходится&amp;lt;ref&amp;gt;EM алгоритм (пример) machinelearning.ru [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])&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Многие статьи&amp;lt;ref name=FREERIDE&amp;gt;Leonid Glimcher, Gagan Agrawal. Parallelising EM Algorithm on a Cluster of SMPs [http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CV&amp;gt;López-de-Teruel P. E., García J. M., Acacio; The Parallel EM Algorithm and its Applications in Computer Vision [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=MULTITHREAD&amp;gt;Sharon X. Lee, Kaleb L. Leemaqz, Geoffrey J. McLachlan. A simple multithreaded implementation of the EM algorithm for mixture models [https://arxiv.org/pdf/1606.02054.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CUDA&amp;gt;Araújo, G.F., H.T. Macedo, M.T. Chella, C.A.E. Montesco and M.V.O. Medeiros. PARALLEL IMPLEMENTATION OF EXPECTATION-MAXIMISATION ALGORITHM FOR THE TRAINING OF GAUSSIAN MIXTURE MODELS [https://ri.ufs.br/bitstream/123456789/1764/1/ExpectationMaximisationAlgorithm.pdf]&amp;lt;/ref&amp;gt;, в которых представлены параллельные реализации EM алгоритма, описывают помимо использующихся программных и аппаратных решений результаты проведенных экспериментов с данными. В качестве примера в этом разделе будут рассмотрены результаты эксперементов, проведенных со связующим программным обеспечением (&#039;&#039;middleware&#039;&#039;) FREERIDE&amp;lt;ref&amp;gt;Leonid Glimchera, Ruoming Jinb, Gagan Agrawala. Middleware for data mining applications on clusters and grids [http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf]&amp;lt;/ref&amp;gt; (FRamework for Rapid Implementation of Datamining Engines), обеспечивающим возможность распараллеливания как для систем с общей памятью (в частности, симметричных мультипроцессорных систем), так и для систем с распределенной памятью.&lt;br /&gt;
&lt;br /&gt;
Эксперименты проводились на кластере машин Pentium 700MHz связанных при помощи Myrinet&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Myrinet&amp;lt;/ref&amp;gt; LANai 7.0 на трех наборах данных: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;а)&#039;&#039;&#039; 3.3 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; 6.2 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; 12.5 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
Объекты представляют собой координаты точек 10-мерного пространства.&lt;br /&gt;
 &lt;br /&gt;
Количество машин в кластере варьировалось от 1 до 8, при этом на каждой машине запускалось до четырех параллельных потоков.&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов представлены на рисунках 7-9&amp;lt;ref name=FREERIDE/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_a.png|thumb|center|350px|Рисунок 7: набор данных a)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_b.png|thumb|center|357px|Рисунок 8: набор данных b)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_c.png|thumb|center|351px|Рисунок 9: набор данных c)]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что используемые в данном исследовании машины, как и коммуникационная среда, сейчас не используются и считаются устаревшими, результат приведенных экспериментов наглядно показывает, что EM алгоритм хорошо параллелится, зависимость ускорения от числа узлов в кластере с небольшим количеством узлов близка к линейной, а также, что скорость работы алгоритма линейно зависит от числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Данный раздел может быть дополнен&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Примеры библиотек, содержащих последовательную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV(C++)] ([https://github.com/opencv/opencv/blob/master/modules/ml/src/em.cpp github])&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab]&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html Scikit learn (Python)]&lt;br /&gt;
# [http://mlpack.org/index.html MLPack(C++)]&lt;br /&gt;
&lt;br /&gt;
Примеры библиотек, содержащих параллельную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Здесь приводятся как конкретные реализации, так и статьи, описывающие подходы к реализациям распараллеливания EM-алгоритма&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# [https://spark.apache.org/ Apache Spark]&lt;br /&gt;
# [http://accord-framework.net/ Accord.NET Framework (C#)]&lt;br /&gt;
# Статья об использовании FREERIDE middleware для распараллеливания EM алгоритма &amp;lt;ref name=FREERIDE/&amp;gt; &lt;br /&gt;
# [http://andrewharp.com/gmmcuda реализация с использованием CUDA]&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MPI еще одна реализация с использованием CUDA]&lt;br /&gt;
# статья об использовании параллельного EM алгоритма в задачах компьютерного зрения &amp;lt;ref name=CV/&amp;gt;&lt;br /&gt;
# статья о распараллеливании EM алгоритма с использованием CUDA &amp;lt;ref name=CUDA/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Noite</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:Noite/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=6844</id>
		<title>Участник:Noite/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:Noite/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=6844"/>
		<updated>2016-10-13T19:57:10Z</updated>

		<summary type="html">&lt;p&gt;Noite: /* Инициализация параметров распределений */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n * m^2 * k)&amp;lt;/math&amp;gt; - одна итерация&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n * m + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{assignment}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Noite|Зинченко Д.А.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм кластеризации, основанный на максимизации ожидания (EM-алгоритм) &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
В задачах оптимизации EM-алгоритмом называют итеративную процедуру поиска численного значения экстремума какой-либо функции. В частности, в статистике этот алгоритм используется для оценки максимального правдоподобия. Впервые название EM-алгоритм было предложено в 1977 году&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;, однако его идеи были описаны и раньше&amp;lt;ref name=korolev&amp;gt;В.Ю.Королёв. ЕМ-алгоритм, его модификации и их применение к задаче разделения смесей вероятностных распределений.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм применяется для решения задач двух типов &amp;lt;ref name=korolev/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Анализ неполных данных (данных с пропусками). &lt;br /&gt;
# Оценка максимального правдоподобия в случае, если функцию правдоподобия трудно исследовать аналитически. В этом случае введение набора скрытых переменных может существенно упростить задачу.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к задачам второго типа. В данной статье рассматривается следующая постановка задачи кластеризации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;Дано множество объектов, каждый из которых представляет собой точку в n-мерном метрическом пространстве. Каждому измерению пространства соответствует некоторое свойство объекта. Необходимо разбить это множество на k подмножеств так, чтобы, чтобы элементы каждого подмножества существенно отличались по свойствам от элементов других подмножеств.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование алгоритма EM подразумевает следующее &#039;&#039;предположение об объектах&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Пусть объекты, которые необходимо разбить на кластеры, появляются случайным образом и независимо друг от друга согласно вероятностному распределению, равному смеси (линейной комбинации) распределений кластеров. В данной статье в дальнейшем будет считаться, что распределение каждого кластера является многомерным нормальным распределением с произвольной матрицей ковариации - наиболее часто используемое предположение.&lt;br /&gt;
&lt;br /&gt;
Тогда каждый объект принадлежит каждому кластеру, но с разной вероятностью. EM-алгоритм итеративно оценивает параметры распределений кластеров, максимизируя логарифмическую функцию максимального правдоподобия. После окончания работы алгоритма объект будет отнесен к кластеру, вероятность принадлежности которому максимальна. Вводимый набор скрытых переменных для каждого объекта - вероятности того, что объект принадлежит каждому из кластеров.&lt;br /&gt;
&lt;br /&gt;
Итерация алгоритма состоит из двух последовательных шагов.&lt;br /&gt;
&lt;br /&gt;
# (Expectation) Вычисляются новые ожидаемые значения скрытых переменных.&lt;br /&gt;
# (Maximization) Решается задача максимизации правдоподобия: По текущим значениям скрытых переменных обновляются параметры распределений для кластеров: математическое ожидание, дисперсия и вероятность появления объектов из кластера.&lt;br /&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;N&amp;lt;/math&amp;gt; - количество объектов, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - количество параметров объекта&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\gamma_{n,k}&amp;lt;/math&amp;gt; - значения скрытых переменных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N_{k}&amp;lt;/math&amp;gt; - количество элементов отнесенных к соответствующему кластеру&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{1},...,x_n&amp;lt;/math&amp;gt; - объекты&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Параметры распределений:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{1},...,w_{k}&amp;lt;/math&amp;gt; - вероятности появления объектов из кластеров (веса кластеров), &amp;lt;math&amp;gt;\sum_{k=1}^Kw_{k}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{1},...,\mu_{k}&amp;lt;/math&amp;gt; - центры гауссиан кластеров&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma_{1},...,\Sigma_{k}&amp;lt;/math&amp;gt; - матрицы ковариации гауссиан кластеров, каждая матрица имеет размерность &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Смесь распределений:&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; P(x) = \sum_{j=1}^Kw_jp(x|\mu_{j}, \Sigma_{j})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Цель алгоритма - вычислить параметры распределений, максимизирующих логарифм функции правдоподобия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\ln P(x|w,\mu,\Sigma)= \sum_{n=1}^N \ln \{ \sum_{k=1}^K w_{k}p(x_{n}|\mu_{k},\Sigma_{k})\}&amp;lt;/math&amp;gt;.&amp;lt;/center&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
* В начале работы алгоритма задаются параметры начального приближения:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{i} = 1/K, \mu_{i} = random(x_{j}), i=1..K, j=1..N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{j,j}^{k}=\frac{1}{NK}\sum_{i=1}^N(x_{i,j} - \mu_{k,j})^2, k=1..K, j=1..M&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Поскольку от начального приближения может сильно зависеть результат работы алгоритма, вместо инициализации кластеров случайными центрами, равными весами и диагональными матрицами ковариации, как в приведенных формулах, часто применяют другие способы (подробнее - в [[#Особенности реализации последовательного алгоритма | особенностях реализации]])&#039;&#039;&lt;br /&gt;
* Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
** E-шаг: используя текущее значение параметров &amp;lt;math&amp;gt;w_{1},...,w_{k};\mu_{1},...,\mu_{k};\Sigma^{1},...,\Sigma^{k}&amp;lt;/math&amp;gt;, вычисляем значение вектора скрытых переменных &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\gamma_{n,k}=\frac{w_{k}p(x_{n}|\mu_{k},\Sigma^{k})}{\sum_{j=1}^K w_{j}p(x_{n}|\mu_{j},\Sigma^{j})}, &amp;lt;/math&amp;gt; знаменатель дроби - нормировочный коэффициент&amp;lt;/center&amp;gt;&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p(x|\mu,\Sigma)=\frac{1}{{(2\pi)}^{\frac{N}{2}}\sqrt{|\Sigma|}}exp\biggl\{-\frac{1}{2}{(x-\mu)}^T{\Sigma}^{-1}(x-\mu)\biggr\}&amp;lt;/math&amp;gt; - плотность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерного нормального распределения&amp;lt;/center&amp;gt;&lt;br /&gt;
** М-шаг: переоценка параметров по текущим значениям скрытых переменных для &amp;lt;math&amp;gt;k = 1..K&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\mu^{new}_{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k}x_{n}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{new}^{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k} (x_{n}-\mu_{k}^{new})(x_{n}-\mu_{k}^{new})^{T}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{k}^{new}=\frac{N_{k}}{N}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;N_{k}=\sum_{n=1}^N \gamma_{n,k}&amp;lt;/math&amp;gt;.&amp;lt;/center&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;
Вычислительное ядро алгоритма состоит из двух шагов, повторяющихся каждую итерацию:&lt;br /&gt;
*Обновление скрытых переменных на основе текущих параметров распределений&lt;br /&gt;
*Обновление параметров кластеров: весов, центров и матриц ковариации&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании вычислительного ядра алгоритма]], основную часть алгоритма составляют итеративно проводимые макрооперации: Expectation шаг - вычисление новых значений скрытых переменных, Maximization шаг - обновление параметров кластеров. Макроструктура алгоритма представлена на рисунке 1:&lt;br /&gt;
[[file:EM_macro.png|thumb|center|600px|Рисунок 1: Макроструктура EM-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Примерная схема реализации EM алгоритма с предварительной обработкой матриц ковариации:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
// n - количество объектов&lt;br /&gt;
&lt;br /&gt;
// m - количество координат объектов&lt;br /&gt;
&lt;br /&gt;
// k - количество кластеров&lt;br /&gt;
&lt;br /&gt;
Инициализировать веса и центры кластеров;&lt;br /&gt;
Инициализировать матрицы ковариации;&lt;br /&gt;
&lt;br /&gt;
// Основной цикл&lt;br /&gt;
Пока условие остановки не выполнено&lt;br /&gt;
    // E-шаг&lt;br /&gt;
    В цикле для каждого кластера&lt;br /&gt;
        Вычислить определитель матрицы ковариации Sigma;&lt;br /&gt;
        Вычислить обратную матрицу матрице Sigma;&lt;br /&gt;
    В цикле для каждого объекта&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Вычислить и запомнить p(x | mu, Sigma) для текущего объекта и кластера;&lt;br /&gt;
            Просуммировать вычисленные p(x | mu, Sigma);&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Обновить скрытые переменные gamma;&lt;br /&gt;
    // M-шаг&lt;br /&gt;
    Обновить веса w;&lt;br /&gt;
    Обновить центры кластеров mu;&lt;br /&gt;
    Обновить матрицы ковариации Sigma;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления определителя произвольной матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления матрицы, обратной произвольной матрице ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации - &amp;lt;math&amp;gt;O(k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С учетом заранее вычисленных определителей и обратных матриц сложность вычисления &amp;lt;math&amp;gt;p(x | \mu,\Sigma)&amp;lt;/math&amp;gt; составит: &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага E составит &amp;lt;math&amp;gt;O(n * m^2 * k + k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления весов кластеров &amp;lt;math&amp;gt;O(k * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления центров кластеров &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления одной матрицы ковариации &amp;lt;math&amp;gt;O(n * m)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления всех матриц ковариации &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага M алгоритма - &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит &amp;lt;math&amp;gt;O(k * m^2 * n + k * m^3 + k * m * n)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В предположении, что размерность объектов много меньше их количества &amp;lt;math&amp;gt;m &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt; получим сложность итерации &amp;lt;math&amp;gt;O(k * m^2 * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большУю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее - вынесены за основной цикл шага E&amp;lt;ref name=ParallelEMComparissonGraphLab&amp;gt;Henggang Cui, Jinliang Wei, Wei Dai. Parallel Implementation of Expectation-Maximization for Fast Convergence - School of Computer Science, Carnegie Mellon University. [https://users.ece.cmu.edu/~hengganc/archive/report/final.pdf]&amp;lt;/ref&amp;gt;. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм&amp;lt;ref&amp;gt;Вячеслав Орешков. EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, а суммарная сложность шага E и сложность всей итерации составит &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Макроструктура алгоритма представлена на рисунке 1 (см. [[#Макроструктура алгоритма|раздел 1.4]] статьи).&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 представлена схема вычислений E-шага алгоритма для одного объекта: для объекта &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и параметров &amp;lt;math&amp;gt;w_{j}, \mu_{j}, \Sigma_{j}, j=1..k&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются ненормированные значения скрытых переменных &amp;lt;math&amp;gt;g_{j}&amp;lt;/math&amp;gt;, нормировочный коэффициент &#039;&#039;normСoeff&#039;&#039;, и получаются итоговые значения &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step.png|thumb|center|400px|Рисунок 2: E-шаг EM алгоритма для одного объекта]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 представлена схема вычислений E-шага алгоритма для всех объектов: для объекта &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt; и параметров-векторов &amp;lt;math&amp;gt;w, \mu, \Sigma&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются значения скрытых переменных. &amp;lt;math&amp;gt;E_{i}, i=1..n&amp;lt;/math&amp;gt; - маркооперации, E-шаги для соответствующих объектов.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step_all.png|thumb|center|400px|Рисунок 3: E-шаг EM алгоритма для всех объектов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена схема вычислений M-шага алгоритма для одного кластера: для объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и скрытых переменных &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;, соответствующих степени принадлежности этих объектов кластеру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, согласно формулам шага M [[#Математическое описание алгоритма|раздела 1.2]] вычисляется нормировочный коэффициент &amp;lt;math&amp;gt;N_{j}&amp;lt;/math&amp;gt; и параметры этого кластера: вес &amp;lt;math&amp;gt;w_{j}^{new}&amp;lt;/math&amp;gt;, матрица ковариации &amp;lt;math&amp;gt;\Sigma_{j}^{new}&amp;lt;/math&amp;gt; и центр кластера &amp;lt;math&amp;gt;\mu_{j}^{new}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step.png|thumb|center|400px|Рисунок 4: M-шаг EM алгоритма для одного кластера]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена схема вычислений M-шага алгоритма для всех кластеров. &amp;lt;math&amp;gt;M_{j}, j=1..k&amp;lt;/math&amp;gt; соответствует макрооперации - M-шагу для соответствующего кластера и скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step_all.png|thumb|center|400px|Рисунок 5: M-шаг EM алгоритма для всех кластеров]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Из схем вычислений шагов E и M шагов алгоритма, приведенным в [[#Информационный граф|предыдущем разделе]], видно, что если размерность матрицы ковариации небольшая (тогда вычисление определителя и обратной матрицы матрице ковариации не является трудоемкой операцией), обе макрооперации EM алгоритма можно распараллеливать как по кластерам, так и по объектам.&lt;br /&gt;
&lt;br /&gt;
Как правило количество кластеров, на которые нужно разбить объекты, несравнимо меньше количества объектов, поэтому распараллеливание в большинстве существующих реализаций происходит по объектам: обработка объектов по возможности равномерно распределяются по кластерам. Теоретически (если считать передачу данных между процессорами мгновенной) при наличии неограниченного числа процессоров сложность алгоритма составит &amp;lt;math&amp;gt;O(m^2 * k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* Целое неотрицательное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
* Значения координат объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; объектов с &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; координатами каждый.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;n * m&amp;lt;/math&amp;gt; вещественных чисел (если координаты объектов - вещественные числа), &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целое неотрицательное число.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - для каждого объекта указан номер кластера, к которому он отнесен.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; целых неотрицательных чисел. &lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
=== Преимущества и недостатки ===&lt;br /&gt;
EM-алгоритм обладает следующими преимуществами и недостатками:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Преимущества:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Слабо чувствителен к выбросам&lt;br /&gt;
# Прост в реализации&lt;br /&gt;
# Быстро сходится при удачном выборе начальных значений параметров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Неустойчив к выбору начальных значений параметров - от них зависит как скорость сходимости, так и результат работы: алгоритм может сойтись к локальному экстремуму функции правдоподобия, который может быть существенно ниже глобального.&lt;br /&gt;
# Алгоритм не находит оптимальное количество кластеров. Количество кластеров, на которые нужно разбить множество объектов, является параметром алгоритма.&lt;br /&gt;
# При большой размерности пространства объектов выдвинутое предположение о модели их распределения может быть некорректным.&lt;br /&gt;
&lt;br /&gt;
=== Влияние структуры матрицы ковариации на форму кластера ===&lt;br /&gt;
&lt;br /&gt;
[[file:DifferentCovariance.png|thumb|center|800px|Рисунок 6: Влияние структуры матрицы ковариации на форму кластеров для двумерного случая. a) - матрицы ковариации являются диагональными, b) - матрицы ковариации произвольны. &amp;lt;ref&amp;gt;Mathworks: Clustering Using Gaussian Mixture Models [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 6 наглядно показывает, что при диагональной форме матриц ковариации полуоси эллипса (в общем случае - эллипсоида), соответствующего распределению объектов, отнесенных кластеру, параллельны осям координат объектов. В противном случае полуоси могут располагаться произвольным образом.&lt;br /&gt;
&lt;br /&gt;
=== Общие свойства ===&lt;br /&gt;
[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] EM алгоритма равна &amp;lt;math&amp;gt;m * k * it&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - размерность объекта, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров, а &amp;lt;math&amp;gt;it&amp;lt;/math&amp;gt; - количество итераций. &lt;br /&gt;
&lt;br /&gt;
EM-алгоритм является итерационным, и число итераций в общем случае не фиксировано: оно зависит от условий остановки, начальных приближений и расположения объектов. Поэтому этот алгоритм &#039;&#039;недетерминированный&#039;&#039;. По тем же причинам EM-алгоритм является &#039;&#039;неустойчивым&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
=== Инициализация параметров распределений ===&lt;br /&gt;
Наиболее распространены 3 способа инициализации центров распределений для EM алгоритма:&lt;br /&gt;
# центр распределения совпадает со случайно выбранным объектом &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
# все наблюдения распределяются по кластерам случайным образом, а затем для каждого кластера пересчитывается цент соответствующего распределения&lt;br /&gt;
# центры кластеров получаются в результате работы алгоритма k-means. Использование такой инициализации оправдано тем, что k-means требует меньших вычислительных затрат и быстрее сходится&amp;lt;ref&amp;gt;EM алгоритм (пример) machinelearning.ru [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])&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Многие статьи&amp;lt;ref name=FREERIDE&amp;gt;Leonid Glimcher, Gagan Agrawal. Parallelising EM Algorithm on a Cluster of SMPs [http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CV&amp;gt;López-de-Teruel P. E., García J. M., Acacio; The Parallel EM Algorithm and its Applications in Computer Vision [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=MULTITHREAD&amp;gt;Sharon X. Lee, Kaleb L. Leemaqz, Geoffrey J. McLachlan. A simple multithreaded implementation of the EM algorithm for mixture models [https://arxiv.org/pdf/1606.02054.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CUDA&amp;gt;Araújo, G.F., H.T. Macedo, M.T. Chella, C.A.E. Montesco and M.V.O. Medeiros. PARALLEL IMPLEMENTATION OF EXPECTATION-MAXIMISATION ALGORITHM FOR THE TRAINING OF GAUSSIAN MIXTURE MODELS [https://ri.ufs.br/bitstream/123456789/1764/1/ExpectationMaximisationAlgorithm.pdf]&amp;lt;/ref&amp;gt;, в которых представлены параллельные реализации EM алгоритма, описывают помимо использующихся программных и аппаратных решений результаты проведенных экспериментов с данными. В качестве примера в этом разделе будут рассмотрены результаты эксперементов, проведенных со связующим программным обеспечением (&#039;&#039;middleware&#039;&#039;) FREERIDE&amp;lt;ref&amp;gt;Leonid Glimchera, Ruoming Jinb, Gagan Agrawala. Middleware for data mining applications on clusters and grids [http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf]&amp;lt;/ref&amp;gt; (FRamework for Rapid Implementation of Datamining Engines), обеспечивающим возможность распараллеливания как для систем с общей памятью (в частности, симметричных мультипроцессорных систем), так и для систем с распределенной памятью.&lt;br /&gt;
&lt;br /&gt;
Эксперименты проводились на кластере машин Pentium 700MHz связанных при помощи Myrinet&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Myrinet&amp;lt;/ref&amp;gt; LANai 7.0 на трех наборах данных: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;а)&#039;&#039;&#039; 3.3 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; 6.2 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; 12.5 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
Объекты представляют собой координаты точек 10-мерного пространства.&lt;br /&gt;
 &lt;br /&gt;
Количество машин в кластере варьировалось от 1 до 8, при этом на каждой машине запускалось до четырех параллельных потоков.&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов представлены на рисунках 7-9&amp;lt;ref name=FREERIDE/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_a.png|thumb|center|350px|Рисунок 7: набор данных a)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_b.png|thumb|center|357px|Рисунок 8: набор данных b)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_c.png|thumb|center|351px|Рисунок 9: набор данных c)]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что используемые в данном исследовании машины, как и коммуникационная среда, сейчас не используются и считаются устаревшими, результат приведенных экспериментов наглядно показывает, что EM алгоритм хорошо параллелится, зависимость ускорения от числа узлов в кластере с небольшим количеством узлов близка к линейной, а также, что скорость работы алгоритма линейно зависит от числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Данный раздел может быть дополнен&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Примеры библиотек, содержащих последовательную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV(C++)] ([https://github.com/opencv/opencv/blob/master/modules/ml/src/em.cpp github])&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab]&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html Scikit learn (Python)]&lt;br /&gt;
# [http://mlpack.org/index.html MLPack(C++)]&lt;br /&gt;
&lt;br /&gt;
Примеры библиотек, содержащих параллельную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Здесь приводятся как конкретные реализации, так и статьи, описывающие подходы к реализациям распараллеливания EM-алгоритма&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# [https://spark.apache.org/ Apache Spark]&lt;br /&gt;
# [http://accord-framework.net/ Accord.NET Framework (C#)]&lt;br /&gt;
# Статья об использовании FREERIDE middleware для распараллеливания EM алгоритма &amp;lt;ref name=FREERIDE/&amp;gt; &lt;br /&gt;
# [http://andrewharp.com/gmmcuda реализация с использованием CUDA]&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MPI еще одна реализация с использованием CUDA]&lt;br /&gt;
# статья об использовании параллельного EM алгоритма в задачах компьютерного зрения &amp;lt;ref name=CV/&amp;gt;&lt;br /&gt;
# статья о распараллеливании EM алгоритма с использованием CUDA &amp;lt;ref name=CUDA/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Noite</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:Noite/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=6842</id>
		<title>Участник:Noite/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:Noite/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=6842"/>
		<updated>2016-10-13T19:56:13Z</updated>

		<summary type="html">&lt;p&gt;Noite: /* Инициализация параметров распределений */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n * m^2 * k)&amp;lt;/math&amp;gt; - одна итерация&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n * m + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{assignment}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Noite|Зинченко Д.А.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм кластеризации, основанный на максимизации ожидания (EM-алгоритм) &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
В задачах оптимизации EM-алгоритмом называют итеративную процедуру поиска численного значения экстремума какой-либо функции. В частности, в статистике этот алгоритм используется для оценки максимального правдоподобия. Впервые название EM-алгоритм было предложено в 1977 году&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;, однако его идеи были описаны и раньше&amp;lt;ref name=korolev&amp;gt;В.Ю.Королёв. ЕМ-алгоритм, его модификации и их применение к задаче разделения смесей вероятностных распределений.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм применяется для решения задач двух типов &amp;lt;ref name=korolev/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Анализ неполных данных (данных с пропусками). &lt;br /&gt;
# Оценка максимального правдоподобия в случае, если функцию правдоподобия трудно исследовать аналитически. В этом случае введение набора скрытых переменных может существенно упростить задачу.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к задачам второго типа. В данной статье рассматривается следующая постановка задачи кластеризации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;Дано множество объектов, каждый из которых представляет собой точку в n-мерном метрическом пространстве. Каждому измерению пространства соответствует некоторое свойство объекта. Необходимо разбить это множество на k подмножеств так, чтобы, чтобы элементы каждого подмножества существенно отличались по свойствам от элементов других подмножеств.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование алгоритма EM подразумевает следующее &#039;&#039;предположение об объектах&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Пусть объекты, которые необходимо разбить на кластеры, появляются случайным образом и независимо друг от друга согласно вероятностному распределению, равному смеси (линейной комбинации) распределений кластеров. В данной статье в дальнейшем будет считаться, что распределение каждого кластера является многомерным нормальным распределением с произвольной матрицей ковариации - наиболее часто используемое предположение.&lt;br /&gt;
&lt;br /&gt;
Тогда каждый объект принадлежит каждому кластеру, но с разной вероятностью. EM-алгоритм итеративно оценивает параметры распределений кластеров, максимизируя логарифмическую функцию максимального правдоподобия. После окончания работы алгоритма объект будет отнесен к кластеру, вероятность принадлежности которому максимальна. Вводимый набор скрытых переменных для каждого объекта - вероятности того, что объект принадлежит каждому из кластеров.&lt;br /&gt;
&lt;br /&gt;
Итерация алгоритма состоит из двух последовательных шагов.&lt;br /&gt;
&lt;br /&gt;
# (Expectation) Вычисляются новые ожидаемые значения скрытых переменных.&lt;br /&gt;
# (Maximization) Решается задача максимизации правдоподобия: По текущим значениям скрытых переменных обновляются параметры распределений для кластеров: математическое ожидание, дисперсия и вероятность появления объектов из кластера.&lt;br /&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;N&amp;lt;/math&amp;gt; - количество объектов, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - количество параметров объекта&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\gamma_{n,k}&amp;lt;/math&amp;gt; - значения скрытых переменных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N_{k}&amp;lt;/math&amp;gt; - количество элементов отнесенных к соответствующему кластеру&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{1},...,x_n&amp;lt;/math&amp;gt; - объекты&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Параметры распределений:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{1},...,w_{k}&amp;lt;/math&amp;gt; - вероятности появления объектов из кластеров (веса кластеров), &amp;lt;math&amp;gt;\sum_{k=1}^Kw_{k}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{1},...,\mu_{k}&amp;lt;/math&amp;gt; - центры гауссиан кластеров&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma_{1},...,\Sigma_{k}&amp;lt;/math&amp;gt; - матрицы ковариации гауссиан кластеров, каждая матрица имеет размерность &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Смесь распределений:&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; P(x) = \sum_{j=1}^Kw_jp(x|\mu_{j}, \Sigma_{j})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Цель алгоритма - вычислить параметры распределений, максимизирующих логарифм функции правдоподобия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\ln P(x|w,\mu,\Sigma)= \sum_{n=1}^N \ln \{ \sum_{k=1}^K w_{k}p(x_{n}|\mu_{k},\Sigma_{k})\}&amp;lt;/math&amp;gt;.&amp;lt;/center&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
* В начале работы алгоритма задаются параметры начального приближения:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{i} = 1/K, \mu_{i} = random(x_{j}), i=1..K, j=1..N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{j,j}^{k}=\frac{1}{NK}\sum_{i=1}^N(x_{i,j} - \mu_{k,j})^2, k=1..K, j=1..M&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Поскольку от начального приближения может сильно зависеть результат работы алгоритма, вместо инициализации кластеров случайными центрами, равными весами и диагональными матрицами ковариации, как в приведенных формулах, часто применяют другие способы (подробнее - в [[#Особенности реализации последовательного алгоритма | особенностях реализации]])&#039;&#039;&lt;br /&gt;
* Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
** E-шаг: используя текущее значение параметров &amp;lt;math&amp;gt;w_{1},...,w_{k};\mu_{1},...,\mu_{k};\Sigma^{1},...,\Sigma^{k}&amp;lt;/math&amp;gt;, вычисляем значение вектора скрытых переменных &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\gamma_{n,k}=\frac{w_{k}p(x_{n}|\mu_{k},\Sigma^{k})}{\sum_{j=1}^K w_{j}p(x_{n}|\mu_{j},\Sigma^{j})}, &amp;lt;/math&amp;gt; знаменатель дроби - нормировочный коэффициент&amp;lt;/center&amp;gt;&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p(x|\mu,\Sigma)=\frac{1}{{(2\pi)}^{\frac{N}{2}}\sqrt{|\Sigma|}}exp\biggl\{-\frac{1}{2}{(x-\mu)}^T{\Sigma}^{-1}(x-\mu)\biggr\}&amp;lt;/math&amp;gt; - плотность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерного нормального распределения&amp;lt;/center&amp;gt;&lt;br /&gt;
** М-шаг: переоценка параметров по текущим значениям скрытых переменных для &amp;lt;math&amp;gt;k = 1..K&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\mu^{new}_{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k}x_{n}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{new}^{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k} (x_{n}-\mu_{k}^{new})(x_{n}-\mu_{k}^{new})^{T}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{k}^{new}=\frac{N_{k}}{N}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;N_{k}=\sum_{n=1}^N \gamma_{n,k}&amp;lt;/math&amp;gt;.&amp;lt;/center&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;
Вычислительное ядро алгоритма состоит из двух шагов, повторяющихся каждую итерацию:&lt;br /&gt;
*Обновление скрытых переменных на основе текущих параметров распределений&lt;br /&gt;
*Обновление параметров кластеров: весов, центров и матриц ковариации&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании вычислительного ядра алгоритма]], основную часть алгоритма составляют итеративно проводимые макрооперации: Expectation шаг - вычисление новых значений скрытых переменных, Maximization шаг - обновление параметров кластеров. Макроструктура алгоритма представлена на рисунке 1:&lt;br /&gt;
[[file:EM_macro.png|thumb|center|600px|Рисунок 1: Макроструктура EM-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Примерная схема реализации EM алгоритма с предварительной обработкой матриц ковариации:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
// n - количество объектов&lt;br /&gt;
&lt;br /&gt;
// m - количество координат объектов&lt;br /&gt;
&lt;br /&gt;
// k - количество кластеров&lt;br /&gt;
&lt;br /&gt;
Инициализировать веса и центры кластеров;&lt;br /&gt;
Инициализировать матрицы ковариации;&lt;br /&gt;
&lt;br /&gt;
// Основной цикл&lt;br /&gt;
Пока условие остановки не выполнено&lt;br /&gt;
    // E-шаг&lt;br /&gt;
    В цикле для каждого кластера&lt;br /&gt;
        Вычислить определитель матрицы ковариации Sigma;&lt;br /&gt;
        Вычислить обратную матрицу матрице Sigma;&lt;br /&gt;
    В цикле для каждого объекта&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Вычислить и запомнить p(x | mu, Sigma) для текущего объекта и кластера;&lt;br /&gt;
            Просуммировать вычисленные p(x | mu, Sigma);&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Обновить скрытые переменные gamma;&lt;br /&gt;
    // M-шаг&lt;br /&gt;
    Обновить веса w;&lt;br /&gt;
    Обновить центры кластеров mu;&lt;br /&gt;
    Обновить матрицы ковариации Sigma;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления определителя произвольной матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления матрицы, обратной произвольной матрице ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации - &amp;lt;math&amp;gt;O(k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С учетом заранее вычисленных определителей и обратных матриц сложность вычисления &amp;lt;math&amp;gt;p(x | \mu,\Sigma)&amp;lt;/math&amp;gt; составит: &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага E составит &amp;lt;math&amp;gt;O(n * m^2 * k + k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления весов кластеров &amp;lt;math&amp;gt;O(k * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления центров кластеров &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления одной матрицы ковариации &amp;lt;math&amp;gt;O(n * m)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления всех матриц ковариации &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага M алгоритма - &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит &amp;lt;math&amp;gt;O(k * m^2 * n + k * m^3 + k * m * n)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В предположении, что размерность объектов много меньше их количества &amp;lt;math&amp;gt;m &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt; получим сложность итерации &amp;lt;math&amp;gt;O(k * m^2 * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большУю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее - вынесены за основной цикл шага E&amp;lt;ref name=ParallelEMComparissonGraphLab&amp;gt;Henggang Cui, Jinliang Wei, Wei Dai. Parallel Implementation of Expectation-Maximization for Fast Convergence - School of Computer Science, Carnegie Mellon University. [https://users.ece.cmu.edu/~hengganc/archive/report/final.pdf]&amp;lt;/ref&amp;gt;. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм&amp;lt;ref&amp;gt;Вячеслав Орешков. EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, а суммарная сложность шага E и сложность всей итерации составит &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Макроструктура алгоритма представлена на рисунке 1 (см. [[#Макроструктура алгоритма|раздел 1.4]] статьи).&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 представлена схема вычислений E-шага алгоритма для одного объекта: для объекта &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и параметров &amp;lt;math&amp;gt;w_{j}, \mu_{j}, \Sigma_{j}, j=1..k&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются ненормированные значения скрытых переменных &amp;lt;math&amp;gt;g_{j}&amp;lt;/math&amp;gt;, нормировочный коэффициент &#039;&#039;normСoeff&#039;&#039;, и получаются итоговые значения &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step.png|thumb|center|400px|Рисунок 2: E-шаг EM алгоритма для одного объекта]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 представлена схема вычислений E-шага алгоритма для всех объектов: для объекта &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt; и параметров-векторов &amp;lt;math&amp;gt;w, \mu, \Sigma&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются значения скрытых переменных. &amp;lt;math&amp;gt;E_{i}, i=1..n&amp;lt;/math&amp;gt; - маркооперации, E-шаги для соответствующих объектов.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step_all.png|thumb|center|400px|Рисунок 3: E-шаг EM алгоритма для всех объектов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена схема вычислений M-шага алгоритма для одного кластера: для объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и скрытых переменных &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;, соответствующих степени принадлежности этих объектов кластеру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, согласно формулам шага M [[#Математическое описание алгоритма|раздела 1.2]] вычисляется нормировочный коэффициент &amp;lt;math&amp;gt;N_{j}&amp;lt;/math&amp;gt; и параметры этого кластера: вес &amp;lt;math&amp;gt;w_{j}^{new}&amp;lt;/math&amp;gt;, матрица ковариации &amp;lt;math&amp;gt;\Sigma_{j}^{new}&amp;lt;/math&amp;gt; и центр кластера &amp;lt;math&amp;gt;\mu_{j}^{new}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step.png|thumb|center|400px|Рисунок 4: M-шаг EM алгоритма для одного кластера]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена схема вычислений M-шага алгоритма для всех кластеров. &amp;lt;math&amp;gt;M_{j}, j=1..k&amp;lt;/math&amp;gt; соответствует макрооперации - M-шагу для соответствующего кластера и скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step_all.png|thumb|center|400px|Рисунок 5: M-шаг EM алгоритма для всех кластеров]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Из схем вычислений шагов E и M шагов алгоритма, приведенным в [[#Информационный граф|предыдущем разделе]], видно, что если размерность матрицы ковариации небольшая (тогда вычисление определителя и обратной матрицы матрице ковариации не является трудоемкой операцией), обе макрооперации EM алгоритма можно распараллеливать как по кластерам, так и по объектам.&lt;br /&gt;
&lt;br /&gt;
Как правило количество кластеров, на которые нужно разбить объекты, несравнимо меньше количества объектов, поэтому распараллеливание в большинстве существующих реализаций происходит по объектам: обработка объектов по возможности равномерно распределяются по кластерам. Теоретически (если считать передачу данных между процессорами мгновенной) при наличии неограниченного числа процессоров сложность алгоритма составит &amp;lt;math&amp;gt;O(m^2 * k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* Целое неотрицательное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
* Значения координат объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; объектов с &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; координатами каждый.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;n * m&amp;lt;/math&amp;gt; вещественных чисел (если координаты объектов - вещественные числа), &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целое неотрицательное число.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - для каждого объекта указан номер кластера, к которому он отнесен.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; целых неотрицательных чисел. &lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
=== Преимущества и недостатки ===&lt;br /&gt;
EM-алгоритм обладает следующими преимуществами и недостатками:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Преимущества:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Слабо чувствителен к выбросам&lt;br /&gt;
# Прост в реализации&lt;br /&gt;
# Быстро сходится при удачном выборе начальных значений параметров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Неустойчив к выбору начальных значений параметров - от них зависит как скорость сходимости, так и результат работы: алгоритм может сойтись к локальному экстремуму функции правдоподобия, который может быть существенно ниже глобального.&lt;br /&gt;
# Алгоритм не находит оптимальное количество кластеров. Количество кластеров, на которые нужно разбить множество объектов, является параметром алгоритма.&lt;br /&gt;
# При большой размерности пространства объектов выдвинутое предположение о модели их распределения может быть некорректным.&lt;br /&gt;
&lt;br /&gt;
=== Влияние структуры матрицы ковариации на форму кластера ===&lt;br /&gt;
&lt;br /&gt;
[[file:DifferentCovariance.png|thumb|center|800px|Рисунок 6: Влияние структуры матрицы ковариации на форму кластеров для двумерного случая. a) - матрицы ковариации являются диагональными, b) - матрицы ковариации произвольны. &amp;lt;ref&amp;gt;Mathworks: Clustering Using Gaussian Mixture Models [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 6 наглядно показывает, что при диагональной форме матриц ковариации полуоси эллипса (в общем случае - эллипсоида), соответствующего распределению объектов, отнесенных кластеру, параллельны осям координат объектов. В противном случае полуоси могут располагаться произвольным образом.&lt;br /&gt;
&lt;br /&gt;
=== Общие свойства ===&lt;br /&gt;
[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] EM алгоритма равна &amp;lt;math&amp;gt;m * k * it&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - размерность объекта, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров, а &amp;lt;math&amp;gt;it&amp;lt;/math&amp;gt; - количество итераций. &lt;br /&gt;
&lt;br /&gt;
EM-алгоритм является итерационным, и число итераций в общем случае не фиксировано: оно зависит от условий остановки, начальных приближений и расположения объектов. Поэтому этот алгоритм &#039;&#039;недетерминированный&#039;&#039;. По тем же причинам EM-алгоритм является &#039;&#039;неустойчивым&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
=== Инициализация параметров распределений ===&lt;br /&gt;
Наиболее распространены 3 способа инициализации центров распределений для EM алгоритма:&lt;br /&gt;
# центр распределения совпадает со случайно выбранным объектом &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
# все наблюдения распределяются по кластерам случайным образом, а затем для каждого кластера пересчитывается цент соответствующего распределения&lt;br /&gt;
# центры кластеров получаются в результате работы алгоритма k-means. Использование такой инициализации оправдано тем, что k-means требует меньших вычислительных затрат и быстрее сходится&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_(%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80)&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Многие статьи&amp;lt;ref name=FREERIDE&amp;gt;Leonid Glimcher, Gagan Agrawal. Parallelising EM Algorithm on a Cluster of SMPs [http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CV&amp;gt;López-de-Teruel P. E., García J. M., Acacio; The Parallel EM Algorithm and its Applications in Computer Vision [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=MULTITHREAD&amp;gt;Sharon X. Lee, Kaleb L. Leemaqz, Geoffrey J. McLachlan. A simple multithreaded implementation of the EM algorithm for mixture models [https://arxiv.org/pdf/1606.02054.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CUDA&amp;gt;Araújo, G.F., H.T. Macedo, M.T. Chella, C.A.E. Montesco and M.V.O. Medeiros. PARALLEL IMPLEMENTATION OF EXPECTATION-MAXIMISATION ALGORITHM FOR THE TRAINING OF GAUSSIAN MIXTURE MODELS [https://ri.ufs.br/bitstream/123456789/1764/1/ExpectationMaximisationAlgorithm.pdf]&amp;lt;/ref&amp;gt;, в которых представлены параллельные реализации EM алгоритма, описывают помимо использующихся программных и аппаратных решений результаты проведенных экспериментов с данными. В качестве примера в этом разделе будут рассмотрены результаты эксперементов, проведенных со связующим программным обеспечением (&#039;&#039;middleware&#039;&#039;) FREERIDE&amp;lt;ref&amp;gt;Leonid Glimchera, Ruoming Jinb, Gagan Agrawala. Middleware for data mining applications on clusters and grids [http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf]&amp;lt;/ref&amp;gt; (FRamework for Rapid Implementation of Datamining Engines), обеспечивающим возможность распараллеливания как для систем с общей памятью (в частности, симметричных мультипроцессорных систем), так и для систем с распределенной памятью.&lt;br /&gt;
&lt;br /&gt;
Эксперименты проводились на кластере машин Pentium 700MHz связанных при помощи Myrinet&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Myrinet&amp;lt;/ref&amp;gt; LANai 7.0 на трех наборах данных: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;а)&#039;&#039;&#039; 3.3 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; 6.2 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; 12.5 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
Объекты представляют собой координаты точек 10-мерного пространства.&lt;br /&gt;
 &lt;br /&gt;
Количество машин в кластере варьировалось от 1 до 8, при этом на каждой машине запускалось до четырех параллельных потоков.&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов представлены на рисунках 7-9&amp;lt;ref name=FREERIDE/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_a.png|thumb|center|350px|Рисунок 7: набор данных a)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_b.png|thumb|center|357px|Рисунок 8: набор данных b)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_c.png|thumb|center|351px|Рисунок 9: набор данных c)]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что используемые в данном исследовании машины, как и коммуникационная среда, сейчас не используются и считаются устаревшими, результат приведенных экспериментов наглядно показывает, что EM алгоритм хорошо параллелится, зависимость ускорения от числа узлов в кластере с небольшим количеством узлов близка к линейной, а также, что скорость работы алгоритма линейно зависит от числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Данный раздел может быть дополнен&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Примеры библиотек, содержащих последовательную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV(C++)] ([https://github.com/opencv/opencv/blob/master/modules/ml/src/em.cpp github])&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab]&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html Scikit learn (Python)]&lt;br /&gt;
# [http://mlpack.org/index.html MLPack(C++)]&lt;br /&gt;
&lt;br /&gt;
Примеры библиотек, содержащих параллельную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Здесь приводятся как конкретные реализации, так и статьи, описывающие подходы к реализациям распараллеливания EM-алгоритма&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# [https://spark.apache.org/ Apache Spark]&lt;br /&gt;
# [http://accord-framework.net/ Accord.NET Framework (C#)]&lt;br /&gt;
# Статья об использовании FREERIDE middleware для распараллеливания EM алгоритма &amp;lt;ref name=FREERIDE/&amp;gt; &lt;br /&gt;
# [http://andrewharp.com/gmmcuda реализация с использованием CUDA]&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MPI еще одна реализация с использованием CUDA]&lt;br /&gt;
# статья об использовании параллельного EM алгоритма в задачах компьютерного зрения &amp;lt;ref name=CV/&amp;gt;&lt;br /&gt;
# статья о распараллеливании EM алгоритма с использованием CUDA &amp;lt;ref name=CUDA/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Noite</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:Noite/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=6839</id>
		<title>Участник:Noite/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:Noite/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=6839"/>
		<updated>2016-10-13T19:54:56Z</updated>

		<summary type="html">&lt;p&gt;Noite: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n * m^2 * k)&amp;lt;/math&amp;gt; - одна итерация&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n * m + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{assignment}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Noite|Зинченко Д.А.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм кластеризации, основанный на максимизации ожидания (EM-алгоритм) &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
В задачах оптимизации EM-алгоритмом называют итеративную процедуру поиска численного значения экстремума какой-либо функции. В частности, в статистике этот алгоритм используется для оценки максимального правдоподобия. Впервые название EM-алгоритм было предложено в 1977 году&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;, однако его идеи были описаны и раньше&amp;lt;ref name=korolev&amp;gt;В.Ю.Королёв. ЕМ-алгоритм, его модификации и их применение к задаче разделения смесей вероятностных распределений.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм применяется для решения задач двух типов &amp;lt;ref name=korolev/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Анализ неполных данных (данных с пропусками). &lt;br /&gt;
# Оценка максимального правдоподобия в случае, если функцию правдоподобия трудно исследовать аналитически. В этом случае введение набора скрытых переменных может существенно упростить задачу.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к задачам второго типа. В данной статье рассматривается следующая постановка задачи кластеризации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;Дано множество объектов, каждый из которых представляет собой точку в n-мерном метрическом пространстве. Каждому измерению пространства соответствует некоторое свойство объекта. Необходимо разбить это множество на k подмножеств так, чтобы, чтобы элементы каждого подмножества существенно отличались по свойствам от элементов других подмножеств.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование алгоритма EM подразумевает следующее &#039;&#039;предположение об объектах&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Пусть объекты, которые необходимо разбить на кластеры, появляются случайным образом и независимо друг от друга согласно вероятностному распределению, равному смеси (линейной комбинации) распределений кластеров. В данной статье в дальнейшем будет считаться, что распределение каждого кластера является многомерным нормальным распределением с произвольной матрицей ковариации - наиболее часто используемое предположение.&lt;br /&gt;
&lt;br /&gt;
Тогда каждый объект принадлежит каждому кластеру, но с разной вероятностью. EM-алгоритм итеративно оценивает параметры распределений кластеров, максимизируя логарифмическую функцию максимального правдоподобия. После окончания работы алгоритма объект будет отнесен к кластеру, вероятность принадлежности которому максимальна. Вводимый набор скрытых переменных для каждого объекта - вероятности того, что объект принадлежит каждому из кластеров.&lt;br /&gt;
&lt;br /&gt;
Итерация алгоритма состоит из двух последовательных шагов.&lt;br /&gt;
&lt;br /&gt;
# (Expectation) Вычисляются новые ожидаемые значения скрытых переменных.&lt;br /&gt;
# (Maximization) Решается задача максимизации правдоподобия: По текущим значениям скрытых переменных обновляются параметры распределений для кластеров: математическое ожидание, дисперсия и вероятность появления объектов из кластера.&lt;br /&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;N&amp;lt;/math&amp;gt; - количество объектов, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - количество параметров объекта&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\gamma_{n,k}&amp;lt;/math&amp;gt; - значения скрытых переменных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N_{k}&amp;lt;/math&amp;gt; - количество элементов отнесенных к соответствующему кластеру&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{1},...,x_n&amp;lt;/math&amp;gt; - объекты&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Параметры распределений:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{1},...,w_{k}&amp;lt;/math&amp;gt; - вероятности появления объектов из кластеров (веса кластеров), &amp;lt;math&amp;gt;\sum_{k=1}^Kw_{k}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{1},...,\mu_{k}&amp;lt;/math&amp;gt; - центры гауссиан кластеров&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma_{1},...,\Sigma_{k}&amp;lt;/math&amp;gt; - матрицы ковариации гауссиан кластеров, каждая матрица имеет размерность &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Смесь распределений:&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; P(x) = \sum_{j=1}^Kw_jp(x|\mu_{j}, \Sigma_{j})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Цель алгоритма - вычислить параметры распределений, максимизирующих логарифм функции правдоподобия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\ln P(x|w,\mu,\Sigma)= \sum_{n=1}^N \ln \{ \sum_{k=1}^K w_{k}p(x_{n}|\mu_{k},\Sigma_{k})\}&amp;lt;/math&amp;gt;.&amp;lt;/center&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
* В начале работы алгоритма задаются параметры начального приближения:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{i} = 1/K, \mu_{i} = random(x_{j}), i=1..K, j=1..N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{j,j}^{k}=\frac{1}{NK}\sum_{i=1}^N(x_{i,j} - \mu_{k,j})^2, k=1..K, j=1..M&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Поскольку от начального приближения может сильно зависеть результат работы алгоритма, вместо инициализации кластеров случайными центрами, равными весами и диагональными матрицами ковариации, как в приведенных формулах, часто применяют другие способы (подробнее - в [[#Особенности реализации последовательного алгоритма | особенностях реализации]])&#039;&#039;&lt;br /&gt;
* Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
** E-шаг: используя текущее значение параметров &amp;lt;math&amp;gt;w_{1},...,w_{k};\mu_{1},...,\mu_{k};\Sigma^{1},...,\Sigma^{k}&amp;lt;/math&amp;gt;, вычисляем значение вектора скрытых переменных &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\gamma_{n,k}=\frac{w_{k}p(x_{n}|\mu_{k},\Sigma^{k})}{\sum_{j=1}^K w_{j}p(x_{n}|\mu_{j},\Sigma^{j})}, &amp;lt;/math&amp;gt; знаменатель дроби - нормировочный коэффициент&amp;lt;/center&amp;gt;&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p(x|\mu,\Sigma)=\frac{1}{{(2\pi)}^{\frac{N}{2}}\sqrt{|\Sigma|}}exp\biggl\{-\frac{1}{2}{(x-\mu)}^T{\Sigma}^{-1}(x-\mu)\biggr\}&amp;lt;/math&amp;gt; - плотность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерного нормального распределения&amp;lt;/center&amp;gt;&lt;br /&gt;
** М-шаг: переоценка параметров по текущим значениям скрытых переменных для &amp;lt;math&amp;gt;k = 1..K&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\mu^{new}_{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k}x_{n}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{new}^{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k} (x_{n}-\mu_{k}^{new})(x_{n}-\mu_{k}^{new})^{T}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{k}^{new}=\frac{N_{k}}{N}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;N_{k}=\sum_{n=1}^N \gamma_{n,k}&amp;lt;/math&amp;gt;.&amp;lt;/center&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;
Вычислительное ядро алгоритма состоит из двух шагов, повторяющихся каждую итерацию:&lt;br /&gt;
*Обновление скрытых переменных на основе текущих параметров распределений&lt;br /&gt;
*Обновление параметров кластеров: весов, центров и матриц ковариации&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании вычислительного ядра алгоритма]], основную часть алгоритма составляют итеративно проводимые макрооперации: Expectation шаг - вычисление новых значений скрытых переменных, Maximization шаг - обновление параметров кластеров. Макроструктура алгоритма представлена на рисунке 1:&lt;br /&gt;
[[file:EM_macro.png|thumb|center|600px|Рисунок 1: Макроструктура EM-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Примерная схема реализации EM алгоритма с предварительной обработкой матриц ковариации:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
// n - количество объектов&lt;br /&gt;
&lt;br /&gt;
// m - количество координат объектов&lt;br /&gt;
&lt;br /&gt;
// k - количество кластеров&lt;br /&gt;
&lt;br /&gt;
Инициализировать веса и центры кластеров;&lt;br /&gt;
Инициализировать матрицы ковариации;&lt;br /&gt;
&lt;br /&gt;
// Основной цикл&lt;br /&gt;
Пока условие остановки не выполнено&lt;br /&gt;
    // E-шаг&lt;br /&gt;
    В цикле для каждого кластера&lt;br /&gt;
        Вычислить определитель матрицы ковариации Sigma;&lt;br /&gt;
        Вычислить обратную матрицу матрице Sigma;&lt;br /&gt;
    В цикле для каждого объекта&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Вычислить и запомнить p(x | mu, Sigma) для текущего объекта и кластера;&lt;br /&gt;
            Просуммировать вычисленные p(x | mu, Sigma);&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Обновить скрытые переменные gamma;&lt;br /&gt;
    // M-шаг&lt;br /&gt;
    Обновить веса w;&lt;br /&gt;
    Обновить центры кластеров mu;&lt;br /&gt;
    Обновить матрицы ковариации Sigma;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления определителя произвольной матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления матрицы, обратной произвольной матрице ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации - &amp;lt;math&amp;gt;O(k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С учетом заранее вычисленных определителей и обратных матриц сложность вычисления &amp;lt;math&amp;gt;p(x | \mu,\Sigma)&amp;lt;/math&amp;gt; составит: &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага E составит &amp;lt;math&amp;gt;O(n * m^2 * k + k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления весов кластеров &amp;lt;math&amp;gt;O(k * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления центров кластеров &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления одной матрицы ковариации &amp;lt;math&amp;gt;O(n * m)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления всех матриц ковариации &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага M алгоритма - &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит &amp;lt;math&amp;gt;O(k * m^2 * n + k * m^3 + k * m * n)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В предположении, что размерность объектов много меньше их количества &amp;lt;math&amp;gt;m &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt; получим сложность итерации &amp;lt;math&amp;gt;O(k * m^2 * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большУю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее - вынесены за основной цикл шага E&amp;lt;ref name=ParallelEMComparissonGraphLab&amp;gt;Henggang Cui, Jinliang Wei, Wei Dai. Parallel Implementation of Expectation-Maximization for Fast Convergence - School of Computer Science, Carnegie Mellon University. [https://users.ece.cmu.edu/~hengganc/archive/report/final.pdf]&amp;lt;/ref&amp;gt;. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм&amp;lt;ref&amp;gt;Вячеслав Орешков. EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, а суммарная сложность шага E и сложность всей итерации составит &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Макроструктура алгоритма представлена на рисунке 1 (см. [[#Макроструктура алгоритма|раздел 1.4]] статьи).&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 представлена схема вычислений E-шага алгоритма для одного объекта: для объекта &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и параметров &amp;lt;math&amp;gt;w_{j}, \mu_{j}, \Sigma_{j}, j=1..k&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются ненормированные значения скрытых переменных &amp;lt;math&amp;gt;g_{j}&amp;lt;/math&amp;gt;, нормировочный коэффициент &#039;&#039;normСoeff&#039;&#039;, и получаются итоговые значения &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step.png|thumb|center|400px|Рисунок 2: E-шаг EM алгоритма для одного объекта]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 представлена схема вычислений E-шага алгоритма для всех объектов: для объекта &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt; и параметров-векторов &amp;lt;math&amp;gt;w, \mu, \Sigma&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются значения скрытых переменных. &amp;lt;math&amp;gt;E_{i}, i=1..n&amp;lt;/math&amp;gt; - маркооперации, E-шаги для соответствующих объектов.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step_all.png|thumb|center|400px|Рисунок 3: E-шаг EM алгоритма для всех объектов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена схема вычислений M-шага алгоритма для одного кластера: для объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и скрытых переменных &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;, соответствующих степени принадлежности этих объектов кластеру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, согласно формулам шага M [[#Математическое описание алгоритма|раздела 1.2]] вычисляется нормировочный коэффициент &amp;lt;math&amp;gt;N_{j}&amp;lt;/math&amp;gt; и параметры этого кластера: вес &amp;lt;math&amp;gt;w_{j}^{new}&amp;lt;/math&amp;gt;, матрица ковариации &amp;lt;math&amp;gt;\Sigma_{j}^{new}&amp;lt;/math&amp;gt; и центр кластера &amp;lt;math&amp;gt;\mu_{j}^{new}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step.png|thumb|center|400px|Рисунок 4: M-шаг EM алгоритма для одного кластера]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена схема вычислений M-шага алгоритма для всех кластеров. &amp;lt;math&amp;gt;M_{j}, j=1..k&amp;lt;/math&amp;gt; соответствует макрооперации - M-шагу для соответствующего кластера и скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step_all.png|thumb|center|400px|Рисунок 5: M-шаг EM алгоритма для всех кластеров]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Из схем вычислений шагов E и M шагов алгоритма, приведенным в [[#Информационный граф|предыдущем разделе]], видно, что если размерность матрицы ковариации небольшая (тогда вычисление определителя и обратной матрицы матрице ковариации не является трудоемкой операцией), обе макрооперации EM алгоритма можно распараллеливать как по кластерам, так и по объектам.&lt;br /&gt;
&lt;br /&gt;
Как правило количество кластеров, на которые нужно разбить объекты, несравнимо меньше количества объектов, поэтому распараллеливание в большинстве существующих реализаций происходит по объектам: обработка объектов по возможности равномерно распределяются по кластерам. Теоретически (если считать передачу данных между процессорами мгновенной) при наличии неограниченного числа процессоров сложность алгоритма составит &amp;lt;math&amp;gt;O(m^2 * k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* Целое неотрицательное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
* Значения координат объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; объектов с &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; координатами каждый.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;n * m&amp;lt;/math&amp;gt; вещественных чисел (если координаты объектов - вещественные числа), &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целое неотрицательное число.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - для каждого объекта указан номер кластера, к которому он отнесен.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; целых неотрицательных чисел. &lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
=== Преимущества и недостатки ===&lt;br /&gt;
EM-алгоритм обладает следующими преимуществами и недостатками:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Преимущества:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Слабо чувствителен к выбросам&lt;br /&gt;
# Прост в реализации&lt;br /&gt;
# Быстро сходится при удачном выборе начальных значений параметров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Неустойчив к выбору начальных значений параметров - от них зависит как скорость сходимости, так и результат работы: алгоритм может сойтись к локальному экстремуму функции правдоподобия, который может быть существенно ниже глобального.&lt;br /&gt;
# Алгоритм не находит оптимальное количество кластеров. Количество кластеров, на которые нужно разбить множество объектов, является параметром алгоритма.&lt;br /&gt;
# При большой размерности пространства объектов выдвинутое предположение о модели их распределения может быть некорректным.&lt;br /&gt;
&lt;br /&gt;
=== Влияние структуры матрицы ковариации на форму кластера ===&lt;br /&gt;
&lt;br /&gt;
[[file:DifferentCovariance.png|thumb|center|800px|Рисунок 6: Влияние структуры матрицы ковариации на форму кластеров для двумерного случая. a) - матрицы ковариации являются диагональными, b) - матрицы ковариации произвольны. &amp;lt;ref&amp;gt;Mathworks: Clustering Using Gaussian Mixture Models [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 6 наглядно показывает, что при диагональной форме матриц ковариации полуоси эллипса (в общем случае - эллипсоида), соответствующего распределению объектов, отнесенных кластеру, параллельны осям координат объектов. В противном случае полуоси могут располагаться произвольным образом.&lt;br /&gt;
&lt;br /&gt;
=== Общие свойства ===&lt;br /&gt;
[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] EM алгоритма равна &amp;lt;math&amp;gt;m * k * it&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - размерность объекта, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров, а &amp;lt;math&amp;gt;it&amp;lt;/math&amp;gt; - количество итераций. &lt;br /&gt;
&lt;br /&gt;
EM-алгоритм является итерационным, и число итераций в общем случае не фиксировано: оно зависит от условий остановки, начальных приближений и расположения объектов. Поэтому этот алгоритм &#039;&#039;недетерминированный&#039;&#039;. По тем же причинам EM-алгоритм является &#039;&#039;неустойчивым&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
=== Инициализация параметров распределений ===&lt;br /&gt;
Наиболее распространены 3 способа инициализации центров распределений для EM алгоритма:&lt;br /&gt;
# центр распределения совпадает со случайно выбранным объектом &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
# все наблюдения распределяются по кластерам случайным образом, а затем для каждого кластера пересчитывается цент соответствующего распределения&lt;br /&gt;
# центры кластеров получаются в результате работы алгоритма k-means. Использование такой инициализации оправдано тем, что k-means требует меньших вычислительных затрат и быстрее сходится.&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Многие статьи&amp;lt;ref name=FREERIDE&amp;gt;Leonid Glimcher, Gagan Agrawal. Parallelising EM Algorithm on a Cluster of SMPs [http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CV&amp;gt;López-de-Teruel P. E., García J. M., Acacio; The Parallel EM Algorithm and its Applications in Computer Vision [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=MULTITHREAD&amp;gt;Sharon X. Lee, Kaleb L. Leemaqz, Geoffrey J. McLachlan. A simple multithreaded implementation of the EM algorithm for mixture models [https://arxiv.org/pdf/1606.02054.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CUDA&amp;gt;Araújo, G.F., H.T. Macedo, M.T. Chella, C.A.E. Montesco and M.V.O. Medeiros. PARALLEL IMPLEMENTATION OF EXPECTATION-MAXIMISATION ALGORITHM FOR THE TRAINING OF GAUSSIAN MIXTURE MODELS [https://ri.ufs.br/bitstream/123456789/1764/1/ExpectationMaximisationAlgorithm.pdf]&amp;lt;/ref&amp;gt;, в которых представлены параллельные реализации EM алгоритма, описывают помимо использующихся программных и аппаратных решений результаты проведенных экспериментов с данными. В качестве примера в этом разделе будут рассмотрены результаты эксперементов, проведенных со связующим программным обеспечением (&#039;&#039;middleware&#039;&#039;) FREERIDE&amp;lt;ref&amp;gt;Leonid Glimchera, Ruoming Jinb, Gagan Agrawala. Middleware for data mining applications on clusters and grids [http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf]&amp;lt;/ref&amp;gt; (FRamework for Rapid Implementation of Datamining Engines), обеспечивающим возможность распараллеливания как для систем с общей памятью (в частности, симметричных мультипроцессорных систем), так и для систем с распределенной памятью.&lt;br /&gt;
&lt;br /&gt;
Эксперименты проводились на кластере машин Pentium 700MHz связанных при помощи Myrinet&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Myrinet&amp;lt;/ref&amp;gt; LANai 7.0 на трех наборах данных: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;а)&#039;&#039;&#039; 3.3 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; 6.2 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; 12.5 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
Объекты представляют собой координаты точек 10-мерного пространства.&lt;br /&gt;
 &lt;br /&gt;
Количество машин в кластере варьировалось от 1 до 8, при этом на каждой машине запускалось до четырех параллельных потоков.&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов представлены на рисунках 7-9&amp;lt;ref name=FREERIDE/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_a.png|thumb|center|350px|Рисунок 7: набор данных a)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_b.png|thumb|center|357px|Рисунок 8: набор данных b)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_c.png|thumb|center|351px|Рисунок 9: набор данных c)]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что используемые в данном исследовании машины, как и коммуникационная среда, сейчас не используются и считаются устаревшими, результат приведенных экспериментов наглядно показывает, что EM алгоритм хорошо параллелится, зависимость ускорения от числа узлов в кластере с небольшим количеством узлов близка к линейной, а также, что скорость работы алгоритма линейно зависит от числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Данный раздел может быть дополнен&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Примеры библиотек, содержащих последовательную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV(C++)] ([https://github.com/opencv/opencv/blob/master/modules/ml/src/em.cpp github])&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab]&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html Scikit learn (Python)]&lt;br /&gt;
# [http://mlpack.org/index.html MLPack(C++)]&lt;br /&gt;
&lt;br /&gt;
Примеры библиотек, содержащих параллельную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Здесь приводятся как конкретные реализации, так и статьи, описывающие подходы к реализациям распараллеливания EM-алгоритма&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# [https://spark.apache.org/ Apache Spark]&lt;br /&gt;
# [http://accord-framework.net/ Accord.NET Framework (C#)]&lt;br /&gt;
# Статья об использовании FREERIDE middleware для распараллеливания EM алгоритма &amp;lt;ref name=FREERIDE/&amp;gt; &lt;br /&gt;
# [http://andrewharp.com/gmmcuda реализация с использованием CUDA]&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MPI еще одна реализация с использованием CUDA]&lt;br /&gt;
# статья об использовании параллельного EM алгоритма в задачах компьютерного зрения &amp;lt;ref name=CV/&amp;gt;&lt;br /&gt;
# статья о распараллеливании EM алгоритма с использованием CUDA &amp;lt;ref name=CUDA/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Noite</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:Noite/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=6835</id>
		<title>Участник:Noite/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:Noite/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=6835"/>
		<updated>2016-10-13T19:52:06Z</updated>

		<summary type="html">&lt;p&gt;Noite: /* Особенности реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n * m^2 * k)&amp;lt;/math&amp;gt; - одна итерация&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n * m + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Noite|Зинченко Д.А.]]&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации, основанный на максимизации ожидания (EM-алгоритм)&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
В задачах оптимизации EM-алгоритмом называют итеративную процедуру поиска численного значения экстремума какой-либо функции. В частности, в статистике этот алгоритм используется для оценки максимального правдоподобия. Впервые название EM-алгоритм было предложено в 1977 году&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;, однако его идеи были описаны и раньше&amp;lt;ref name=korolev&amp;gt;В.Ю.Королёв. ЕМ-алгоритм, его модификации и их применение к задаче разделения смесей вероятностных распределений.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм применяется для решения задач двух типов &amp;lt;ref name=korolev/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Анализ неполных данных (данных с пропусками). &lt;br /&gt;
# Оценка максимального правдоподобия в случае, если функцию правдоподобия трудно исследовать аналитически. В этом случае введение набора скрытых переменных может существенно упростить задачу.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к задачам второго типа. В данной статье рассматривается следующая постановка задачи кластеризации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;Дано множество объектов, каждый из которых представляет собой точку в n-мерном метрическом пространстве. Каждому измерению пространства соответствует некоторое свойство объекта. Необходимо разбить это множество на k подмножеств так, чтобы, чтобы элементы каждого подмножества существенно отличались по свойствам от элементов других подмножеств.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование алгоритма EM подразумевает следующее &#039;&#039;предположение об объектах&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Пусть объекты, которые необходимо разбить на кластеры, появляются случайным образом и независимо друг от друга согласно вероятностному распределению, равному смеси (линейной комбинации) распределений кластеров. В данной статье в дальнейшем будет считаться, что распределение каждого кластера является многомерным нормальным распределением с произвольной матрицей ковариации - наиболее часто используемое предположение.&lt;br /&gt;
&lt;br /&gt;
Тогда каждый объект принадлежит каждому кластеру, но с разной вероятностью. EM-алгоритм итеративно оценивает параметры распределений кластеров, максимизируя логарифмическую функцию максимального правдоподобия. После окончания работы алгоритма объект будет отнесен к кластеру, вероятность принадлежности которому максимальна. Вводимый набор скрытых переменных для каждого объекта - вероятности того, что объект принадлежит каждому из кластеров.&lt;br /&gt;
&lt;br /&gt;
Итерация алгоритма состоит из двух последовательных шагов.&lt;br /&gt;
&lt;br /&gt;
# (Expectation) Вычисляются новые ожидаемые значения скрытых переменных.&lt;br /&gt;
# (Maximization) Решается задача максимизации правдоподобия: По текущим значениям скрытых переменных обновляются параметры распределений для кластеров: математическое ожидание, дисперсия и вероятность появления объектов из кластера.&lt;br /&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;N&amp;lt;/math&amp;gt; - количество объектов, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - количество параметров объекта&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\gamma_{n,k}&amp;lt;/math&amp;gt; - значения скрытых переменных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N_{k}&amp;lt;/math&amp;gt; - количество элементов отнесенных к соответствующему кластеру&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{1},...,x_n&amp;lt;/math&amp;gt; - объекты&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Параметры распределений:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{1},...,w_{k}&amp;lt;/math&amp;gt; - вероятности появления объектов из кластеров (веса кластеров), &amp;lt;math&amp;gt;\sum_{k=1}^Kw_{k}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{1},...,\mu_{k}&amp;lt;/math&amp;gt; - центры гауссиан кластеров&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma_{1},...,\Sigma_{k}&amp;lt;/math&amp;gt; - матрицы ковариации гауссиан кластеров, каждая матрица имеет размерность &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Смесь распределений:&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; P(x) = \sum_{j=1}^Kw_jp(x|\mu_{j}, \Sigma_{j})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Цель алгоритма - вычислить параметры распределений, максимизирующих логарифм функции правдоподобия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\ln P(x|w,\mu,\Sigma)= \sum_{n=1}^N \ln \{ \sum_{k=1}^K w_{k}p(x_{n}|\mu_{k},\Sigma_{k})\}&amp;lt;/math&amp;gt;.&amp;lt;/center&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
* В начале работы алгоритма задаются параметры начального приближения:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{i} = 1/K, \mu_{i} = random(x_{j}), i=1..K, j=1..N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{j,j}^{k}=\frac{1}{NK}\sum_{i=1}^N(x_{i,j} - \mu_{k,j})^2, k=1..K, j=1..M&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Поскольку от начального приближения может сильно зависеть результат работы алгоритма, вместо инициализации кластеров случайными центрами, равными весами и диагональными матрицами ковариации, как в приведенных формулах, часто применяют другие способы (подробнее - в [[#Особенности реализации последовательного алгоритма | особенностях реализации]])&#039;&#039;&lt;br /&gt;
* Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
** E-шаг: используя текущее значение параметров &amp;lt;math&amp;gt;w_{1},...,w_{k};\mu_{1},...,\mu_{k};\Sigma^{1},...,\Sigma^{k}&amp;lt;/math&amp;gt;, вычисляем значение вектора скрытых переменных &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\gamma_{n,k}=\frac{w_{k}p(x_{n}|\mu_{k},\Sigma^{k})}{\sum_{j=1}^K w_{j}p(x_{n}|\mu_{j},\Sigma^{j})}, &amp;lt;/math&amp;gt; знаменатель дроби - нормировочный коэффициент&amp;lt;/center&amp;gt;&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p(x|\mu,\Sigma)=\frac{1}{{(2\pi)}^{\frac{N}{2}}\sqrt{|\Sigma|}}exp\biggl\{-\frac{1}{2}{(x-\mu)}^T{\Sigma}^{-1}(x-\mu)\biggr\}&amp;lt;/math&amp;gt; - плотность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерного нормального распределения&amp;lt;/center&amp;gt;&lt;br /&gt;
** М-шаг: переоценка параметров по текущим значениям скрытых переменных для &amp;lt;math&amp;gt;k = 1..K&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\mu^{new}_{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k}x_{n}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{new}^{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k} (x_{n}-\mu_{k}^{new})(x_{n}-\mu_{k}^{new})^{T}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{k}^{new}=\frac{N_{k}}{N}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;N_{k}=\sum_{n=1}^N \gamma_{n,k}&amp;lt;/math&amp;gt;.&amp;lt;/center&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;
Вычислительное ядро алгоритма состоит из двух шагов, повторяющихся каждую итерацию:&lt;br /&gt;
*Обновление скрытых переменных на основе текущих параметров распределений&lt;br /&gt;
*Обновление параметров кластеров: весов, центров и матриц ковариации&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании вычислительного ядра алгоритма]], основную часть алгоритма составляют итеративно проводимые макрооперации: Expectation шаг - вычисление новых значений скрытых переменных, Maximization шаг - обновление параметров кластеров. Макроструктура алгоритма представлена на рисунке 1:&lt;br /&gt;
[[file:EM_macro.png|thumb|center|600px|Рисунок 1: Макроструктура EM-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Примерная схема реализации EM алгоритма с предварительной обработкой матриц ковариации:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
// n - количество объектов&lt;br /&gt;
&lt;br /&gt;
// m - количество координат объектов&lt;br /&gt;
&lt;br /&gt;
// k - количество кластеров&lt;br /&gt;
&lt;br /&gt;
Инициализировать веса и центры кластеров;&lt;br /&gt;
Инициализировать матрицы ковариации;&lt;br /&gt;
&lt;br /&gt;
// Основной цикл&lt;br /&gt;
Пока условие остановки не выполнено&lt;br /&gt;
    // E-шаг&lt;br /&gt;
    В цикле для каждого кластера&lt;br /&gt;
        Вычислить определитель матрицы ковариации Sigma;&lt;br /&gt;
        Вычислить обратную матрицу матрице Sigma;&lt;br /&gt;
    В цикле для каждого объекта&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Вычислить и запомнить p(x | mu, Sigma) для текущего объекта и кластера;&lt;br /&gt;
            Просуммировать вычисленные p(x | mu, Sigma);&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Обновить скрытые переменные gamma;&lt;br /&gt;
    // M-шаг&lt;br /&gt;
    Обновить веса w;&lt;br /&gt;
    Обновить центры кластеров mu;&lt;br /&gt;
    Обновить матрицы ковариации Sigma;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления определителя произвольной матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления матрицы, обратной произвольной матрице ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации - &amp;lt;math&amp;gt;O(k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С учетом заранее вычисленных определителей и обратных матриц сложность вычисления &amp;lt;math&amp;gt;p(x | \mu,\Sigma)&amp;lt;/math&amp;gt; составит: &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага E составит &amp;lt;math&amp;gt;O(n * m^2 * k + k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления весов кластеров &amp;lt;math&amp;gt;O(k * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления центров кластеров &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления одной матрицы ковариации &amp;lt;math&amp;gt;O(n * m)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления всех матриц ковариации &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага M алгоритма - &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит &amp;lt;math&amp;gt;O(k * m^2 * n + k * m^3 + k * m * n)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В предположении, что размерность объектов много меньше их количества &amp;lt;math&amp;gt;m &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt; получим сложность итерации &amp;lt;math&amp;gt;O(k * m^2 * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большУю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее - вынесены за основной цикл шага E&amp;lt;ref name=ParallelEMComparissonGraphLab&amp;gt;Henggang Cui, Jinliang Wei, Wei Dai. Parallel Implementation of Expectation-Maximization for Fast Convergence - School of Computer Science, Carnegie Mellon University. [https://users.ece.cmu.edu/~hengganc/archive/report/final.pdf]&amp;lt;/ref&amp;gt;. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм&amp;lt;ref&amp;gt;Вячеслав Орешков. EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, а суммарная сложность шага E и сложность всей итерации составит &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Макроструктура алгоритма представлена на рисунке 1 (см. [[#Макроструктура алгоритма|раздел 1.4]] статьи).&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 представлена схема вычислений E-шага алгоритма для одного объекта: для объекта &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и параметров &amp;lt;math&amp;gt;w_{j}, \mu_{j}, \Sigma_{j}, j=1..k&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются ненормированные значения скрытых переменных &amp;lt;math&amp;gt;g_{j}&amp;lt;/math&amp;gt;, нормировочный коэффициент &#039;&#039;normСoeff&#039;&#039;, и получаются итоговые значения &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step.png|thumb|center|400px|Рисунок 2: E-шаг EM алгоритма для одного объекта]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 представлена схема вычислений E-шага алгоритма для всех объектов: для объекта &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt; и параметров-векторов &amp;lt;math&amp;gt;w, \mu, \Sigma&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются значения скрытых переменных. &amp;lt;math&amp;gt;E_{i}, i=1..n&amp;lt;/math&amp;gt; - маркооперации, E-шаги для соответствующих объектов.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step_all.png|thumb|center|400px|Рисунок 3: E-шаг EM алгоритма для всех объектов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена схема вычислений M-шага алгоритма для одного кластера: для объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и скрытых переменных &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;, соответствующих степени принадлежности этих объектов кластеру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, согласно формулам шага M [[#Математическое описание алгоритма|раздела 1.2]] вычисляется нормировочный коэффициент &amp;lt;math&amp;gt;N_{j}&amp;lt;/math&amp;gt; и параметры этого кластера: вес &amp;lt;math&amp;gt;w_{j}^{new}&amp;lt;/math&amp;gt;, матрица ковариации &amp;lt;math&amp;gt;\Sigma_{j}^{new}&amp;lt;/math&amp;gt; и центр кластера &amp;lt;math&amp;gt;\mu_{j}^{new}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step.png|thumb|center|400px|Рисунок 4: M-шаг EM алгоритма для одного кластера]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена схема вычислений M-шага алгоритма для всех кластеров. &amp;lt;math&amp;gt;M_{j}, j=1..k&amp;lt;/math&amp;gt; соответствует макрооперации - M-шагу для соответствующего кластера и скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step_all.png|thumb|center|400px|Рисунок 5: M-шаг EM алгоритма для всех кластеров]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Из схем вычислений шагов E и M шагов алгоритма, приведенным в [[#Информационный граф|предыдущем разделе]], видно, что если размерность матрицы ковариации небольшая (тогда вычисление определителя и обратной матрицы матрице ковариации не является трудоемкой операцией), обе макрооперации EM алгоритма можно распараллеливать как по кластерам, так и по объектам.&lt;br /&gt;
&lt;br /&gt;
Как правило количество кластеров, на которые нужно разбить объекты, несравнимо меньше количества объектов, поэтому распараллеливание в большинстве существующих реализаций происходит по объектам: обработка объектов по возможности равномерно распределяются по кластерам. Теоретически (если считать передачу данных между процессорами мгновенной) при наличии неограниченного числа процессоров сложность алгоритма составит &amp;lt;math&amp;gt;O(m^2 * k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* Целое неотрицательное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
* Значения координат объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; объектов с &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; координатами каждый.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;n * m&amp;lt;/math&amp;gt; вещественных чисел (если координаты объектов - вещественные числа), &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целое неотрицательное число.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - для каждого объекта указан номер кластера, к которому он отнесен.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; целых неотрицательных чисел. &lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
=== Преимущества и недостатки ===&lt;br /&gt;
EM-алгоритм обладает следующими преимуществами и недостатками:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Преимущества:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Слабо чувствителен к выбросам&lt;br /&gt;
# Прост в реализации&lt;br /&gt;
# Быстро сходится при удачном выборе начальных значений параметров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Неустойчив к выбору начальных значений параметров - от них зависит как скорость сходимости, так и результат работы: алгоритм может сойтись к локальному экстремуму функции правдоподобия, который может быть существенно ниже глобального.&lt;br /&gt;
# Алгоритм не находит оптимальное количество кластеров. Количество кластеров, на которые нужно разбить множество объектов, является параметром алгоритма.&lt;br /&gt;
# При большой размерности пространства объектов выдвинутое предположение о модели их распределения может быть некорректным.&lt;br /&gt;
&lt;br /&gt;
=== Влияние структуры матрицы ковариации на форму кластера ===&lt;br /&gt;
&lt;br /&gt;
[[file:DifferentCovariance.png|thumb|center|800px|Рисунок 6: Влияние структуры матрицы ковариации на форму кластеров для двумерного случая. a) - матрицы ковариации являются диагональными, b) - матрицы ковариации произвольны. &amp;lt;ref&amp;gt;Mathworks: Clustering Using Gaussian Mixture Models [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 6 наглядно показывает, что при диагональной форме матриц ковариации полуоси эллипса (в общем случае - эллипсоида), соответствующего распределению объектов, отнесенных кластеру, параллельны осям координат объектов. В противном случае полуоси могут располагаться произвольным образом.&lt;br /&gt;
&lt;br /&gt;
=== Общие свойства ===&lt;br /&gt;
[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] EM алгоритма равна &amp;lt;math&amp;gt;m * k * it&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - размерность объекта, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров, а &amp;lt;math&amp;gt;it&amp;lt;/math&amp;gt; - количество итераций. &lt;br /&gt;
&lt;br /&gt;
EM-алгоритм является итерационным, и число итераций в общем случае не фиксировано: оно зависит от условий остановки, начальных приближений и расположения объектов. Поэтому этот алгоритм &#039;&#039;недетерминированный&#039;&#039;. По тем же причинам EM-алгоритм является &#039;&#039;неустойчивым&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
=== Инициализация параметров распределений ===&lt;br /&gt;
Наиболее распространены 3 способа инициализации центров распределений для EM алгоритма:&lt;br /&gt;
# центр распределения совпадает со случайно выбранным объектом &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
# все наблюдения распределяются по кластерам случайным образом, а затем для каждого кластера пересчитывается цент соответствующего распределения&lt;br /&gt;
# центры кластеров получаются в результате работы алгоритма k-means. Использование такой инициализации оправдано тем, что k-means требует меньших вычислительных затрат и быстрее сходится.&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Многие статьи&amp;lt;ref name=FREERIDE&amp;gt;Leonid Glimcher, Gagan Agrawal. Parallelising EM Algorithm on a Cluster of SMPs [http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CV&amp;gt;López-de-Teruel P. E., García J. M., Acacio; The Parallel EM Algorithm and its Applications in Computer Vision [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=MULTITHREAD&amp;gt;Sharon X. Lee, Kaleb L. Leemaqz, Geoffrey J. McLachlan. A simple multithreaded implementation of the EM algorithm for mixture models [https://arxiv.org/pdf/1606.02054.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CUDA&amp;gt;Araújo, G.F., H.T. Macedo, M.T. Chella, C.A.E. Montesco and M.V.O. Medeiros. PARALLEL IMPLEMENTATION OF EXPECTATION-MAXIMISATION ALGORITHM FOR THE TRAINING OF GAUSSIAN MIXTURE MODELS [https://ri.ufs.br/bitstream/123456789/1764/1/ExpectationMaximisationAlgorithm.pdf]&amp;lt;/ref&amp;gt;, в которых представлены параллельные реализации EM алгоритма, описывают помимо использующихся программных и аппаратных решений результаты проведенных экспериментов с данными. В качестве примера в этом разделе будут рассмотрены результаты эксперементов, проведенных со связующим программным обеспечением (&#039;&#039;middleware&#039;&#039;) FREERIDE&amp;lt;ref&amp;gt;Leonid Glimchera, Ruoming Jinb, Gagan Agrawala. Middleware for data mining applications on clusters and grids [http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf]&amp;lt;/ref&amp;gt; (FRamework for Rapid Implementation of Datamining Engines), обеспечивающим возможность распараллеливания как для систем с общей памятью (в частности, симметричных мультипроцессорных систем), так и для систем с распределенной памятью.&lt;br /&gt;
&lt;br /&gt;
Эксперименты проводились на кластере машин Pentium 700MHz связанных при помощи Myrinet&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Myrinet&amp;lt;/ref&amp;gt; LANai 7.0 на трех наборах данных: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;а)&#039;&#039;&#039; 3.3 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; 6.2 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; 12.5 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
Объекты представляют собой координаты точек 10-мерного пространства.&lt;br /&gt;
 &lt;br /&gt;
Количество машин в кластере варьировалось от 1 до 8, при этом на каждой машине запускалось до четырех параллельных потоков.&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов представлены на рисунках 7-9&amp;lt;ref name=FREERIDE/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_a.png|thumb|center|350px|Рисунок 7: набор данных a)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_b.png|thumb|center|357px|Рисунок 8: набор данных b)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_c.png|thumb|center|351px|Рисунок 9: набор данных c)]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что используемые в данном исследовании машины, как и коммуникационная среда, сейчас не используются и считаются устаревшими, результат приведенных экспериментов наглядно показывает, что EM алгоритм хорошо параллелится, зависимость ускорения от числа узлов в кластере с небольшим количеством узлов близка к линейной, а также, что скорость работы алгоритма линейно зависит от числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Данный раздел может быть дополнен&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Примеры библиотек, содержащих последовательную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV(C++)] ([https://github.com/opencv/opencv/blob/master/modules/ml/src/em.cpp github])&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab]&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html Scikit learn (Python)]&lt;br /&gt;
# [http://mlpack.org/index.html MLPack(C++)]&lt;br /&gt;
&lt;br /&gt;
Примеры библиотек, содержащих параллельную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Здесь приводятся как конкретные реализации, так и статьи, описывающие подходы к реализациям распараллеливания EM-алгоритма&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# [https://spark.apache.org/ Apache Spark]&lt;br /&gt;
# [http://accord-framework.net/ Accord.NET Framework (C#)]&lt;br /&gt;
# Статья об использовании FREERIDE middleware для распараллеливания EM алгоритма &amp;lt;ref name=FREERIDE/&amp;gt; &lt;br /&gt;
# [http://andrewharp.com/gmmcuda реализация с использованием CUDA]&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MPI еще одна реализация с использованием CUDA]&lt;br /&gt;
# статья об использовании параллельного EM алгоритма в задачах компьютерного зрения &amp;lt;ref name=CV/&amp;gt;&lt;br /&gt;
# статья о распараллеливании EM алгоритма с использованием CUDA &amp;lt;ref name=CUDA/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Noite</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:Noite/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=6777</id>
		<title>Участник:Noite/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:Noite/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=6777"/>
		<updated>2016-10-13T19:06:51Z</updated>

		<summary type="html">&lt;p&gt;Noite: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n * m^2 * k)&amp;lt;/math&amp;gt; - одна итерация&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n * m + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Noite|Зинченко Д.А.]]&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации, основанный на максимизации ожидания (EM-алгоритм)&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
В задачах оптимизации EM-алгоритмом называют итеративную процедуру поиска численного значения экстремума какой-либо функции. В частности, в статистике этот алгоритм используется для оценки максимального правдоподобия. Впервые название EM-алгоритм было предложено в 1977 году&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;, однако его идеи были описаны и раньше&amp;lt;ref name=korolev&amp;gt;В.Ю.Королёв. ЕМ-алгоритм, его модификации и их применение к задаче разделения смесей вероятностных распределений.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм применяется для решения задач двух типов &amp;lt;ref name=korolev/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Анализ неполных данных (данных с пропусками). &lt;br /&gt;
# Оценка максимального правдоподобия в случае, если функцию правдоподобия трудно исследовать аналитически. В этом случае введение набора скрытых переменных может существенно упростить задачу.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к задачам второго типа. В данной статье рассматривается следующая постановка задачи кластеризации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;Дано множество объектов, каждый из которых представляет собой точку в n-мерном метрическом пространстве. Каждому измерению пространства соответствует некоторое свойство объекта. Необходимо разбить это множество на k подмножеств так, чтобы, чтобы элементы каждого подмножества существенно отличались по свойствам от элементов других подмножеств.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование алгоритма EM подразумевает следующее &#039;&#039;предположение об объектах&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Пусть объекты, которые необходимо разбить на кластеры, появляются случайным образом и независимо друг от друга согласно вероятностному распределению, равному смеси (линейной комбинации) распределений кластеров. В данной статье в дальнейшем будет считаться, что распределение каждого кластера является многомерным нормальным распределением с произвольной матрицей ковариации - наиболее часто используемое предположение.&lt;br /&gt;
&lt;br /&gt;
Тогда каждый объект принадлежит каждому кластеру, но с разной вероятностью. EM-алгоритм итеративно оценивает параметры распределений кластеров, максимизируя логарифмическую функцию максимального правдоподобия. После окончания работы алгоритма объект будет отнесен к кластеру, вероятность принадлежности которому максимальна. Вводимый набор скрытых переменных для каждого объекта - вероятности того, что объект принадлежит каждому из кластеров.&lt;br /&gt;
&lt;br /&gt;
Итерация алгоритма состоит из двух последовательных шагов.&lt;br /&gt;
&lt;br /&gt;
# (Expectation) Вычисляются новые ожидаемые значения скрытых переменных.&lt;br /&gt;
# (Maximization) Решается задача максимизации правдоподобия: По текущим значениям скрытых переменных обновляются параметры распределений для кластеров: математическое ожидание, дисперсия и вероятность появления объектов из кластера.&lt;br /&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;N&amp;lt;/math&amp;gt; - количество объектов, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - количество параметров объекта&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\gamma_{n,k}&amp;lt;/math&amp;gt; - значения скрытых переменных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N_{k}&amp;lt;/math&amp;gt; - количество элементов отнесенных к соответствующему кластеру&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{1},...,x_n&amp;lt;/math&amp;gt; - объекты&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Параметры распределений:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{1},...,w_{k}&amp;lt;/math&amp;gt; - вероятности появления объектов из кластеров (веса кластеров), &amp;lt;math&amp;gt;\sum_{k=1}^Kw_{k}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{1},...,\mu_{k}&amp;lt;/math&amp;gt; - центры гауссиан кластеров&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma_{1},...,\Sigma_{k}&amp;lt;/math&amp;gt; - матрицы ковариации гауссиан кластеров, каждая матрица имеет размерность &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Смесь распределений:&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; P(x) = \sum_{j=1}^Kw_jp(x|\mu_{j}, \Sigma_{j})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Цель алгоритма - вычислить параметры распределений, максимизирующих логарифм функции правдоподобия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\ln P(x|w,\mu,\Sigma)= \sum_{n=1}^N \ln \{ \sum_{k=1}^K w_{k}p(x_{n}|\mu_{k},\Sigma_{k})\}&amp;lt;/math&amp;gt;.&amp;lt;/center&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
* В начале работы алгоритма задаются параметры начального приближения:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{i} = 1/K, \mu_{i} = random(x_{j}), i=1..K, j=1..N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{j,j}^{k}=\frac{1}{NK}\sum_{i=1}^N(x_{i,j} - \mu_{k,j})^2, k=1..K, j=1..M&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Поскольку от начального приближения может сильно зависеть результат работы алгоритма, вместо инициализации кластеров случайными центрами, равными весами и диагональными матрицами ковариации, как в приведенных формулах, часто применяют другие способы (подробнее - в [[#Особенности реализации последовательного алгоритма | особенностях реализации]])&#039;&#039;&lt;br /&gt;
* Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
** E-шаг: используя текущее значение параметров &amp;lt;math&amp;gt;w_{1},...,w_{k};\mu_{1},...,\mu_{k};\Sigma^{1},...,\Sigma^{k}&amp;lt;/math&amp;gt;, вычисляем значение вектора скрытых переменных &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\gamma_{n,k}=\frac{w_{k}p(x_{n}|\mu_{k},\Sigma^{k})}{\sum_{j=1}^K w_{j}p(x_{n}|\mu_{j},\Sigma^{j})}, &amp;lt;/math&amp;gt; знаменатель дроби - нормировочный коэффициент&amp;lt;/center&amp;gt;&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p(x|\mu,\Sigma)=\frac{1}{{(2\pi)}^{\frac{N}{2}}\sqrt{|\Sigma|}}exp\biggl\{-\frac{1}{2}{(x-\mu)}^T{\Sigma}^{-1}(x-\mu)\biggr\}&amp;lt;/math&amp;gt; - плотность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерного нормального распределения&amp;lt;/center&amp;gt;&lt;br /&gt;
** М-шаг: переоценка параметров по текущим значениям скрытых переменных для &amp;lt;math&amp;gt;k = 1..K&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\mu^{new}_{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k}x_{n}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{new}^{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k} (x_{n}-\mu_{k}^{new})(x_{n}-\mu_{k}^{new})^{T}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{k}^{new}=\frac{N_{k}}{N}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;N_{k}=\sum_{n=1}^N \gamma_{n,k}&amp;lt;/math&amp;gt;.&amp;lt;/center&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;
Вычислительное ядро алгоритма состоит из двух шагов, повторяющихся каждую итерацию:&lt;br /&gt;
*Обновление скрытых переменных на основе текущих параметров распределений&lt;br /&gt;
*Обновление параметров кластеров: весов, центров и матриц ковариации&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании вычислительного ядра алгоритма]], основную часть алгоритма составляют итеративно проводимые макрооперации: Expectation шаг - вычисление новых значений скрытых переменных, Maximization шаг - обновление параметров кластеров. Макроструктура алгоритма представлена на рисунке 1:&lt;br /&gt;
[[file:EM_macro.png|thumb|center|600px|Рисунок 1: Макроструктура EM-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Примерная схема реализации EM алгоритма с предварительной обработкой матриц ковариации:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
// n - количество объектов&lt;br /&gt;
&lt;br /&gt;
// m - количество координат объектов&lt;br /&gt;
&lt;br /&gt;
// k - количество кластеров&lt;br /&gt;
&lt;br /&gt;
Инициализировать веса и центры кластеров;&lt;br /&gt;
Инициализировать матрицы ковариации;&lt;br /&gt;
&lt;br /&gt;
// Основной цикл&lt;br /&gt;
Пока условие остановки не выполнено&lt;br /&gt;
    // E-шаг&lt;br /&gt;
    В цикле для каждого кластера&lt;br /&gt;
        Вычислить определитель матрицы ковариации Sigma;&lt;br /&gt;
        Вычислить обратную матрицу матрице Sigma;&lt;br /&gt;
    В цикле для каждого объекта&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Вычислить и запомнить p(x | mu, Sigma) для текущего объекта и кластера;&lt;br /&gt;
            Просуммировать вычисленные p(x | mu, Sigma);&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Обновить скрытые переменные gamma;&lt;br /&gt;
    // M-шаг&lt;br /&gt;
    Обновить веса w;&lt;br /&gt;
    Обновить центры кластеров mu;&lt;br /&gt;
    Обновить матрицы ковариации Sigma;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления определителя произвольной матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления матрицы, обратной произвольной матрице ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации - &amp;lt;math&amp;gt;O(k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С учетом заранее вычисленных определителей и обратных матриц сложность вычисления &amp;lt;math&amp;gt;p(x | \mu,\Sigma)&amp;lt;/math&amp;gt; составит: &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага E составит &amp;lt;math&amp;gt;O(n * m^2 * k + k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления весов кластеров &amp;lt;math&amp;gt;O(k * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления центров кластеров &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления одной матрицы ковариации &amp;lt;math&amp;gt;O(n * m)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления всех матриц ковариации &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага M алгоритма - &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит &amp;lt;math&amp;gt;O(k * m^2 * n + k * m^3 + k * m * n)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В предположении, что размерность объектов много меньше их количества &amp;lt;math&amp;gt;m &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt; получим сложность итерации &amp;lt;math&amp;gt;O(k * m^2 * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большУю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее - вынесены за основной цикл шага E&amp;lt;ref name=ParallelEMComparissonGraphLab&amp;gt;Henggang Cui, Jinliang Wei, Wei Dai. Parallel Implementation of Expectation-Maximization for Fast Convergence - School of Computer Science, Carnegie Mellon University. [https://users.ece.cmu.edu/~hengganc/archive/report/final.pdf]&amp;lt;/ref&amp;gt;. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм&amp;lt;ref&amp;gt;Вячеслав Орешков. EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, а суммарная сложность шага E и сложность всей итерации составит &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Макроструктура алгоритма представлена на рисунке 1 (см. [[#Макроструктура алгоритма|раздел 1.4]] статьи).&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 представлена схема вычислений E-шага алгоритма для одного объекта: для объекта &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и параметров &amp;lt;math&amp;gt;w_{j}, \mu_{j}, \Sigma_{j}, j=1..k&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются ненормированные значения скрытых переменных &amp;lt;math&amp;gt;g_{j}&amp;lt;/math&amp;gt;, нормировочный коэффициент &#039;&#039;normСoeff&#039;&#039;, и получаются итоговые значения &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step.png|thumb|center|400px|Рисунок 2: E-шаг EM алгоритма для одного объекта]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 представлена схема вычислений E-шага алгоритма для всех объектов: для объекта &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt; и параметров-векторов &amp;lt;math&amp;gt;w, \mu, \Sigma&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются значения скрытых переменных. &amp;lt;math&amp;gt;E_{i}, i=1..n&amp;lt;/math&amp;gt; - маркооперации, E-шаги для соответствующих объектов.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step_all.png|thumb|center|400px|Рисунок 3: E-шаг EM алгоритма для всех объектов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена схема вычислений M-шага алгоритма для одного кластера: для объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и скрытых переменных &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;, соответствующих степени принадлежности этих объектов кластеру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, согласно формулам шага M [[#Математическое описание алгоритма|раздела 1.2]] вычисляется нормировочный коэффициент &amp;lt;math&amp;gt;N_{j}&amp;lt;/math&amp;gt; и параметры этого кластера: вес &amp;lt;math&amp;gt;w_{j}^{new}&amp;lt;/math&amp;gt;, матрица ковариации &amp;lt;math&amp;gt;\Sigma_{j}^{new}&amp;lt;/math&amp;gt; и центр кластера &amp;lt;math&amp;gt;\mu_{j}^{new}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step.png|thumb|center|400px|Рисунок 4: M-шаг EM алгоритма для одного кластера]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена схема вычислений M-шага алгоритма для всех кластеров. &amp;lt;math&amp;gt;M_{j}, j=1..k&amp;lt;/math&amp;gt; соответствует макрооперации - M-шагу для соответствующего кластера и скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step_all.png|thumb|center|400px|Рисунок 5: M-шаг EM алгоритма для всех кластеров]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Из схем вычислений шагов E и M шагов алгоритма, приведенным в [[#Информационный граф|предыдущем разделе]], видно, что если размерность матрицы ковариации небольшая (тогда вычисление определителя и обратной матрицы матрице ковариации не является трудоемкой операцией), обе макрооперации EM алгоритма можно распараллеливать как по кластерам, так и по объектам.&lt;br /&gt;
&lt;br /&gt;
Как правило количество кластеров, на которые нужно разбить объекты, несравнимо меньше количества объектов, поэтому распараллеливание в большинстве существующих реализаций происходит по объектам: обработка объектов по возможности равномерно распределяются по кластерам. Теоретически (если считать передачу данных между процессорами мгновенной) при наличии неограниченного числа процессоров сложность алгоритма составит &amp;lt;math&amp;gt;O(m^2 * k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* Целое неотрицательное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
* Значения координат объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; объектов с &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; координатами каждый.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;n * m&amp;lt;/math&amp;gt; вещественных чисел (если координаты объектов - вещественные числа), &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целое неотрицательное число.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - для каждого объекта указан номер кластера, к которому он отнесен.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; целых неотрицательных чисел. &lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
=== Преимущества и недостатки ===&lt;br /&gt;
EM-алгоритм обладает следующими преимуществами и недостатками:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Преимущества:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Слабо чувствителен к выбросам&lt;br /&gt;
# Прост в реализации&lt;br /&gt;
# Быстро сходится при удачном выборе начальных значений параметров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Неустойчив к выбору начальных значений параметров - от них зависит как скорость сходимости, так и результат работы: алгоритм может сойтись к локальному экстремуму функции правдоподобия, который может быть существенно ниже глобального.&lt;br /&gt;
# Алгоритм не находит оптимальное количество кластеров. Количество кластеров, на которые нужно разбить множество объектов, является параметром алгоритма.&lt;br /&gt;
# При большой размерности пространства объектов выдвинутое предположение о модели их распределения может быть некорректным.&lt;br /&gt;
&lt;br /&gt;
=== Влияние структуры матрицы ковариации на форму кластера ===&lt;br /&gt;
&lt;br /&gt;
[[file:DifferentCovariance.png|thumb|center|800px|Рисунок 6: Влияние структуры матрицы ковариации на форму кластеров для двумерного случая. a) - матрицы ковариации являются диагональными, b) - матрицы ковариации произвольны. &amp;lt;ref&amp;gt;Mathworks: Clustering Using Gaussian Mixture Models [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 6 наглядно показывает, что при диагональной форме матриц ковариации полуоси эллипса (в общем случае - эллипсоида), соответствующего распределению объектов, отнесенных кластеру, параллельны осям координат объектов. В противном случае полуоси могут располагаться произвольным образом.&lt;br /&gt;
&lt;br /&gt;
=== Общие свойства ===&lt;br /&gt;
[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] EM алгоритма равна &amp;lt;math&amp;gt;m * k * it&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - размерность объекта, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров, а &amp;lt;math&amp;gt;it&amp;lt;/math&amp;gt; - количество итераций. &lt;br /&gt;
&lt;br /&gt;
EM-алгоритм является итерационным, и число итераций в общем случае не фиксировано: оно зависит от условий остановки, начальных приближений и расположения объектов. Поэтому этот алгоритм &#039;&#039;недетерминированный&#039;&#039;. По тем же причинам EM-алгоритм является &#039;&#039;неустойчивым&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Многие статьи&amp;lt;ref name=FREERIDE&amp;gt;Leonid Glimcher, Gagan Agrawal. Parallelising EM Algorithm on a Cluster of SMPs [http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CV&amp;gt;López-de-Teruel P. E., García J. M., Acacio; The Parallel EM Algorithm and its Applications in Computer Vision [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=MULTITHREAD&amp;gt;Sharon X. Lee, Kaleb L. Leemaqz, Geoffrey J. McLachlan. A simple multithreaded implementation of the EM algorithm for mixture models [https://arxiv.org/pdf/1606.02054.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CUDA&amp;gt;Araújo, G.F., H.T. Macedo, M.T. Chella, C.A.E. Montesco and M.V.O. Medeiros. PARALLEL IMPLEMENTATION OF EXPECTATION-MAXIMISATION ALGORITHM FOR THE TRAINING OF GAUSSIAN MIXTURE MODELS [https://ri.ufs.br/bitstream/123456789/1764/1/ExpectationMaximisationAlgorithm.pdf]&amp;lt;/ref&amp;gt;, в которых представлены параллельные реализации EM алгоритма, описывают помимо использующихся программных и аппаратных решений результаты проведенных экспериментов с данными. В качестве примера в этом разделе будут рассмотрены результаты эксперементов, проведенных со связующим программным обеспечением (&#039;&#039;middleware&#039;&#039;) FREERIDE&amp;lt;ref&amp;gt;Leonid Glimchera, Ruoming Jinb, Gagan Agrawala. Middleware for data mining applications on clusters and grids [http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf]&amp;lt;/ref&amp;gt; (FRamework for Rapid Implementation of Datamining Engines), обеспечивающим возможность распараллеливания как для систем с общей памятью (в частности, симметричных мультипроцессорных систем), так и для систем с распределенной памятью.&lt;br /&gt;
&lt;br /&gt;
Эксперименты проводились на кластере машин Pentium 700MHz связанных при помощи Myrinet&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Myrinet&amp;lt;/ref&amp;gt; LANai 7.0 на трех наборах данных: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;а)&#039;&#039;&#039; 3.3 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; 6.2 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; 12.5 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
Объекты представляют собой координаты точек 10-мерного пространства.&lt;br /&gt;
 &lt;br /&gt;
Количество машин в кластере варьировалось от 1 до 8, при этом на каждой машине запускалось до четырех параллельных потоков.&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов представлены на рисунках 7-9&amp;lt;ref name=FREERIDE/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_a.png|thumb|center|350px|Рисунок 7: набор данных a)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_b.png|thumb|center|357px|Рисунок 8: набор данных b)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_c.png|thumb|center|351px|Рисунок 9: набор данных c)]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что используемые в данном исследовании машины, как и коммуникационная среда, сейчас не используются и считаются устаревшими, результат приведенных экспериментов наглядно показывает, что EM алгоритм хорошо параллелится, зависимость ускорения от числа узлов в кластере с небольшим количеством узлов близка к линейной, а также, что скорость работы алгоритма линейно зависит от числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Данный раздел может быть дополнен&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Примеры библиотек, содержащих последовательную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV(C++)] ([https://github.com/opencv/opencv/blob/master/modules/ml/src/em.cpp github])&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab]&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html Scikit learn (Python)]&lt;br /&gt;
# [http://mlpack.org/index.html MLPack(C++)]&lt;br /&gt;
&lt;br /&gt;
Примеры библиотек, содержащих параллельную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Здесь приводятся как конкретные реализации, так и статьи, описывающие подходы к реализациям распараллеливания EM-алгоритма&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# [https://spark.apache.org/ Apache Spark]&lt;br /&gt;
# [http://accord-framework.net/ Accord.NET Framework (C#)]&lt;br /&gt;
# Статья об использовании FREERIDE middleware для распараллеливания EM алгоритма &amp;lt;ref name=FREERIDE/&amp;gt; &lt;br /&gt;
# [http://andrewharp.com/gmmcuda реализация с использованием CUDA]&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MPI еще одна реализация с использованием CUDA]&lt;br /&gt;
# статья об использовании параллельного EM алгоритма в задачах компьютерного зрения &amp;lt;ref name=CV/&amp;gt;&lt;br /&gt;
# статья о распараллеливании EM алгоритма с использованием CUDA &amp;lt;ref name=CUDA/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Noite</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:Noite/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=6776</id>
		<title>Участник:Noite/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:Noite/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=6776"/>
		<updated>2016-10-13T19:06:05Z</updated>

		<summary type="html">&lt;p&gt;Noite: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n * m^2 * k)&amp;lt;/math&amp;gt; - одна итерация&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n * m + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Noite|Зинченко Д.А.]]&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации, основанный на максимизации ожидания (EM-алгоритм)&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
В задачах оптимизации EM-алгоритмом называют итеративную процедуру поиска численного значения экстремума какой-либо функции. В частности, в статистике этот алгоритм используется для оценки максимального правдоподобия. Впервые название EM-алгоритм было предложено в 1977 году&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;, однако его идеи были описаны и раньше&amp;lt;ref name=korolev&amp;gt;В.Ю.Королёв. ЕМ-алгоритм, его модификации и их применение к задаче разделения смесей вероятностных распределений.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм применяется для решения задач двух типов &amp;lt;ref name=korolev/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Анализ неполных данных (данных с пропусками). &lt;br /&gt;
# Оценка максимального правдоподобия в случае, если функцию правдоподобия трудно исследовать аналитически. В этом случае введение набора скрытых переменных может существенно упростить задачу.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к задачам второго типа. В данной статье рассматривается следующая постановка задачи кластеризации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;Дано множество объектов, каждый из которых представляет собой точку в n-мерном метрическом пространстве. Каждому измерению пространства соответствует некоторое свойство объекта. Необходимо разбить это множество на k подмножеств так, чтобы, чтобы элементы каждого подмножества существенно отличались по свойствам от элементов других подмножеств.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование алгоритма EM подразумевает следующее &#039;&#039;предположение об объектах&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Пусть объекты, которые необходимо разбить на кластеры, появляются случайным образом и независимо друг от друга согласно вероятностному распределению, равному смеси (линейной комбинации) распределений кластеров. В данной статье в дальнейшем будет считаться, что распределение каждого кластера является многомерным нормальным распределением с произвольной матрицей ковариации - наиболее часто используемое предположение.&lt;br /&gt;
&lt;br /&gt;
Тогда каждый объект принадлежит каждому кластеру, но с разной вероятностью. EM-алгоритм итеративно оценивает параметры распределений кластеров, максимизируя логарифмическую функцию максимального правдоподобия. После окончания работы алгоритма объект будет отнесен к кластеру, вероятность принадлежности которому максимальна. Вводимый набор скрытых переменных для каждого объекта - вероятности того, что объект принадлежит каждому из кластеров.&lt;br /&gt;
&lt;br /&gt;
Итерация алгоритма состоит из двух последовательных шагов.&lt;br /&gt;
&lt;br /&gt;
# (Expectation) Вычисляются новые ожидаемые значения скрытых переменных.&lt;br /&gt;
# (Maximization) Решается задача максимизации правдоподобия: По текущим значениям скрытых переменных обновляются параметры распределений для кластеров: математическое ожидание, дисперсия и вероятность появления объектов из кластера.&lt;br /&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;N&amp;lt;/math&amp;gt; - количество объектов, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - количество параметров объекта&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\gamma_{n,k}&amp;lt;/math&amp;gt; - значения скрытых переменных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N_{k}&amp;lt;/math&amp;gt; - количество элементов отнесенных к соответствующему кластеру&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{1},...,x_n&amp;lt;/math&amp;gt; - объекты&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Параметры распределений:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{1},...,w_{k}&amp;lt;/math&amp;gt; - вероятности появления объектов из кластеров (веса кластеров), &amp;lt;math&amp;gt;\sum_{k=1}^Kw_{k}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{1},...,\mu_{k}&amp;lt;/math&amp;gt; - центры гауссиан кластеров&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma_{1},...,\Sigma_{k}&amp;lt;/math&amp;gt; - матрицы ковариации гауссиан кластеров, каждая матрица имеет размерность &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Смесь распределений:&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; P(x) = \sum_{j=1}^Kw_jp(x|\mu_{j}, \Sigma_{j})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Цель алгоритма - вычислить параметры распределений, максимизирующих логарифм функции правдоподобия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\ln P(x|w,\mu,\Sigma)= \sum_{n=1}^N \ln \{ \sum_{k=1}^K w_{k}p(x_{n}|\mu_{k},\Sigma_{k})\}&amp;lt;/math&amp;gt;.&amp;lt;/center&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
* В начале работы алгоритма задаются параметры начального приближения:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{i} = 1/K, \mu_{i} = random(x_{j}), i=1..K, j=1..N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{j,j}^{k}=\frac{1}{NK}\sum_{i=1}^N(x_{i,j} - \mu_{k,j})^2, k=1..K, j=1..M&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Поскольку от начального приближения может сильно зависеть результат работы алгоритма, вместо инициализации кластеров случайными центрами, равными весами и диагональными матрицами ковариации, как в приведенных формулах, часто применяют другие способы (подробнее - в [[#Особенности реализации последовательного алгоритма | особенностях реализации]])&#039;&#039;&lt;br /&gt;
* Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
** E-шаг: используя текущее значение параметров &amp;lt;math&amp;gt;w_{1},...,w_{k};\mu_{1},...,\mu_{k};\Sigma^{1},...,\Sigma^{k}&amp;lt;/math&amp;gt;, вычисляем значение вектора скрытых переменных &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\gamma_{n,k}=\frac{w_{k}p(x_{n}|\mu_{k},\Sigma^{k})}{\sum_{j=1}^K w_{j}p(x_{n}|\mu_{j},\Sigma^{j})}, &amp;lt;/math&amp;gt; знаменатель дроби - нормировочный коэффициент&amp;lt;/center&amp;gt;&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p(x|\mu,\Sigma)=\frac{1}{{(2\pi)}^{\frac{N}{2}}\sqrt{|\Sigma|}}exp\biggl\{-\frac{1}{2}{(x-\mu)}^T{\Sigma}^{-1}(x-\mu)\biggr\}&amp;lt;/math&amp;gt; - плотность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерного нормального распределения&amp;lt;/center&amp;gt;&lt;br /&gt;
** М-шаг: переоценка параметров по текущим значениям скрытых переменных для &amp;lt;math&amp;gt;k = 1..K&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\mu^{new}_{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k}x_{n}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{new}^{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k} (x_{n}-\mu_{k}^{new})(x_{n}-\mu_{k}^{new})^{T}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{k}^{new}=\frac{N_{k}}{N}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;N_{k}=\sum_{n=1}^N \gamma_{n,k}&amp;lt;/math&amp;gt;.&amp;lt;/center&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;
Вычислительное ядро алгоритма состоит из двух шагов, повторяющихся каждую итерацию:&lt;br /&gt;
*Обновление скрытых переменных на основе текущих параметров распределений&lt;br /&gt;
*Обновление параметров кластеров: весов, центров и матриц ковариации&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании вычислительного ядра алгоритма]], основную часть алгоритма составляют итеративно проводимые макрооперации: Expectation шаг - вычисление новых значений скрытых переменных, Maximization шаг - обновление параметров кластеров. Макроструктура алгоритма представлена на рисунке 1:&lt;br /&gt;
[[file:EM_macro.png|thumb|center|600px|Рисунок 1: Макроструктура EM-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Примерная схема реализации EM алгоритма с предварительной обработкой матриц ковариации:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
// n - количество объектов&lt;br /&gt;
&lt;br /&gt;
// m - количество координат объектов&lt;br /&gt;
&lt;br /&gt;
// k - количество кластеров&lt;br /&gt;
&lt;br /&gt;
Инициализировать веса и центры кластеров;&lt;br /&gt;
Инициализировать матрицы ковариации;&lt;br /&gt;
&lt;br /&gt;
// Основной цикл&lt;br /&gt;
Пока условие остановки не выполнено&lt;br /&gt;
    // E-шаг&lt;br /&gt;
    В цикле для каждого кластера&lt;br /&gt;
        Вычислить определитель матрицы ковариации Sigma;&lt;br /&gt;
        Вычислить обратную матрицу матрице Sigma;&lt;br /&gt;
    В цикле для каждого объекта&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Вычислить и запомнить p(x | mu, Sigma) для текущего объекта и кластера;&lt;br /&gt;
            Просуммировать вычисленные p(x | mu, Sigma);&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Обновить скрытые переменные gamma;&lt;br /&gt;
    // M-шаг&lt;br /&gt;
    Обновить веса w;&lt;br /&gt;
    Обновить центры кластеров mu;&lt;br /&gt;
    Обновить матрицы ковариации Sigma;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления определителя произвольной матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления матрицы, обратной произвольной матрице ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации - &amp;lt;math&amp;gt;O(k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С учетом заранее вычисленных определителей и обратных матриц сложность вычисления &amp;lt;math&amp;gt;p(x | \mu,\Sigma)&amp;lt;/math&amp;gt; составит: &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага E составит &amp;lt;math&amp;gt;O(n * m^2 * k + k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления весов кластеров &amp;lt;math&amp;gt;O(k * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления центров кластеров &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления одной матрицы ковариации &amp;lt;math&amp;gt;O(n * m)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления всех матриц ковариации &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага M алгоритма - &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит &amp;lt;math&amp;gt;O(k * m^2 * n + k * m^3 + k * m * n)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В предположении, что размерность объектов много меньше их количества &amp;lt;math&amp;gt;m &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt; получим сложность итерации &amp;lt;math&amp;gt;O(k * m^2 * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большУю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее - вынесены за основной цикл шага E&amp;lt;ref name=ParallelEMComparissonGraphLab&amp;gt;Henggang Cui, Jinliang Wei, Wei Dai. Parallel Implementation of Expectation-Maximization for Fast Convergence - School of Computer Science, Carnegie Mellon University. [https://users.ece.cmu.edu/~hengganc/archive/report/final.pdf]&amp;lt;/ref&amp;gt;. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм&amp;lt;ref&amp;gt;Вячеслав Орешков. EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, а суммарная сложность шага E и сложность всей итерации составит &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Макроструктура алгоритма представлена на рисунке 1 (см. [[#Макроструктура алгоритма|раздел 1.4]] статьи).&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 представлена схема вычислений E-шага алгоритма для одного объекта: для объекта &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и параметров &amp;lt;math&amp;gt;w_{j}, \mu_{j}, \Sigma_{j}, j=1..k&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются ненормированные значения скрытых переменных &amp;lt;math&amp;gt;g_{j}&amp;lt;/math&amp;gt;, нормировочный коэффициент &#039;&#039;normСoeff&#039;&#039;, и получаются итоговые значения &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step.png|thumb|center|400px|Рисунок 2: E-шаг EM алгоритма для одного объекта]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 представлена схема вычислений E-шага алгоритма для всех объектов: для объекта &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt; и параметров-векторов &amp;lt;math&amp;gt;w, \mu, \Sigma&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются значения скрытых переменных. &amp;lt;math&amp;gt;E_{i}, i=1..n&amp;lt;/math&amp;gt; - маркооперации, E-шаги для соответствующих объектов.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step_all.png|thumb|center|400px|Рисунок 3: E-шаг EM алгоритма для всех объектов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена схема вычислений M-шага алгоритма для одного кластера: для объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и скрытых переменных &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;, соответствующих степени принадлежности этих объектов кластеру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, согласно формулам шага M [[#Математическое описание алгоритма|раздела 1.2]] вычисляется нормировочный коэффициент &amp;lt;math&amp;gt;N_{j}&amp;lt;/math&amp;gt; и параметры этого кластера: вес &amp;lt;math&amp;gt;w_{j}^{new}&amp;lt;/math&amp;gt;, матрица ковариации &amp;lt;math&amp;gt;\Sigma_{j}^{new}&amp;lt;/math&amp;gt; и центр кластера &amp;lt;math&amp;gt;\mu_{j}^{new}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step.png|thumb|center|400px|Рисунок 4: M-шаг EM алгоритма для одного кластера]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена схема вычислений M-шага алгоритма для всех кластеров. &amp;lt;math&amp;gt;M_{j}, j=1..k&amp;lt;/math&amp;gt; соответствует макрооперации - M-шагу для соответствующего кластера и скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step_all.png|thumb|center|400px|Рисунок 5: M-шаг EM алгоритма для всех кластеров]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Из схем вычислений шагов E и M шагов алгоритма, приведенным в [[#Информационный граф|предыдущем разделе]], видно, что если размерность матрицы ковариации небольшая (тогда вычисление определителя и обратной матрицы матрице ковариации не является трудоемкой операцией), обе макрооперации EM алгоритма можно распараллеливать как по кластерам, так и по объектам.&lt;br /&gt;
&lt;br /&gt;
Как правило количество кластеров, на которые нужно разбить объекты, несравнимо меньше количества объектов, поэтому распараллеливание в большинстве существующих реализаций происходит по объектам: обработка объектов по возможности равномерно распределяются по кластерам. Теоретически (если считать передачу данных между процессорами мгновенной) при наличии неограниченного числа процессоров сложность алгоритма составит &amp;lt;math&amp;gt;O(m^2 * k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* Целое неотрицательное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
* Значения координат объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; объектов с &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; координатами каждый.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;n * m&amp;lt;/math&amp;gt; вещественных чисел (если координаты объектов - вещественные числа), &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целое неотрицательное число.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - для каждого объекта указан номер кластера, к которому он отнесен.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; целых неотрицательных чисел. &lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
=== Преимущества и недостатки ===&lt;br /&gt;
EM-алгоритм обладает следующими преимуществами и недостатками:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Преимущества:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Слабо чувствителен к выбросам&lt;br /&gt;
# Прост в реализации&lt;br /&gt;
# Быстро сходится при удачном выборе начальных значений параметров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Неустойчив к выбору начальных значений параметров - от них зависит как скорость сходимости, так и результат работы: алгоритм может сойтись к локальному экстремуму функции правдоподобия, который может быть существенно ниже глобального.&lt;br /&gt;
# Алгоритм не находит оптимальное количество кластеров. Количество кластеров, на которые нужно разбить множество объектов, является параметром алгоритма.&lt;br /&gt;
# При большой размерности пространства объектов выдвинутое предположение о модели их распределения может быть некорректным.&lt;br /&gt;
&lt;br /&gt;
=== Влияние структуры матрицы ковариации на форму кластера ===&lt;br /&gt;
&lt;br /&gt;
[[file:DifferentCovariance.png|thumb|center|800px|Рисунок 6: Влияние структуры матрицы ковариации на форму кластеров для двумерного случая. a) - матрицы ковариации являются диагональными, b) - матрицы ковариации произвольны. &amp;lt;ref&amp;gt;Mathworks: Clustering Using Gaussian Mixture Models [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 6 наглядно показывает, что при диагональной форме матриц ковариации полуоси эллипса (в общем случае - эллипсоида), соответствующего распределению объектов, отнесенных кластеру, параллельны осям координат объектов. В противном случае полуоси могут располагаться произвольным образом.&lt;br /&gt;
&lt;br /&gt;
=== Общие свойства ===&lt;br /&gt;
[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] EM алгоритма равна &amp;lt;math&amp;gt;m * k * it&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - размерность объекта, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров, а &amp;lt;math&amp;gt;it&amp;lt;/math&amp;gt; - количество итераций. &lt;br /&gt;
&lt;br /&gt;
EM-алгоритм является итерационным, и число итераций в общем случае не фиксировано: оно зависит от условий остановки, начальных приближений и расположения объектов. Поэтому этот алгоритм &#039;&#039;недетерминированный&#039;&#039;. По тем же причинам EM-алгоритм является &#039;&#039;неустойчивым&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Многие статьи&amp;lt;ref name=FREERIDE&amp;gt;Leonid Glimcher, Gagan Agrawal. Parallelising EM Algorithm on a Cluster of SMPs [http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CV&amp;gt;López-de-Teruel P. E., García J. M., Acacio; The Parallel EM Algorithm and its Applications in Computer Vision [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=MULTITHREAD&amp;gt;Sharon X. Lee, Kaleb L. Leemaqz, Geoffrey J. McLachlan. A simple multithreaded implementation of the EM algorithm for mixture models [https://arxiv.org/pdf/1606.02054.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CUDA&amp;gt;Araújo, G.F., H.T. Macedo, M.T. Chella, C.A.E. Montesco and M.V.O. Medeiros. PARALLEL IMPLEMENTATION OF EXPECTATION-MAXIMISATION ALGORITHM FOR THE TRAINING OF GAUSSIAN MIXTURE MODELS [https://ri.ufs.br/bitstream/123456789/1764/1/ExpectationMaximisationAlgorithm.pdf]&amp;lt;/ref&amp;gt;, в которых представлены параллельные реализации EM алгоритма, описывают помимо использующихся программных и аппаратных решений результаты проведенных экспериментов с данными. В качестве примера в этом разделе будут рассмотрены результаты эксперементов, проведенных со связующим программным обеспечением (&#039;&#039;middleware&#039;&#039;) FREERIDE&amp;lt;ref&amp;gt;Leonid Glimchera, Ruoming Jinb, Gagan Agrawala. Middleware for data mining applications on clusters and grids [http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf]&amp;lt;/ref&amp;gt; (FRamework for Rapid Implementation of Datamining Engines), обеспечивающим возможность распараллеливания как для систем с общей памятью (в частности, симметричных мультипроцессорных систем), так и для систем с распределенной памятью.&lt;br /&gt;
&lt;br /&gt;
Эксперименты проводились на кластере машин Pentium 700MHz связанных при помощи Myrinet&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Myrinet&amp;lt;/ref&amp;gt; LANai 7.0 на трех наборах данных: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;а)&#039;&#039;&#039; 3.3 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; 6.2 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; 12.5 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
Объекты представляют собой координаты точек 10-мерного пространства.&lt;br /&gt;
 &lt;br /&gt;
Количество машин в кластере варьировалось от 1 до 8, при этом на каждой машине запускалось до четырех параллельных потоков.&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов представлены на рисунках 7-9&amp;lt;ref name=FREERIDE/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_a.png|thumb|center|350px|Рисунок 7: набор данных a)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_b.png|thumb|center|357px|Рисунок 8: набор данных b)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_c.png|thumb|center|351px|Рисунок 9: набор данных c)]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что используемые в данном исследовании машины, как и коммуникационная среда, сейчас не используются и считаются устаревшими, результат приведенных экспериментов наглядно показывает, что EM алгоритм хорошо параллелится, зависимость ускорения от числа узлов в кластере с небольшим количеством узлов близка к линейной, а также, что скорость работы алгоритма линейно зависит от числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Данный раздел считается незавершенным и может дополняться&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Примеры библиотек, содержащих последовательную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV(C++)] ([https://github.com/opencv/opencv/blob/master/modules/ml/src/em.cpp github])&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab]&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html Scikit learn (Python)]&lt;br /&gt;
# [http://mlpack.org/index.html MLPack(C++)]&lt;br /&gt;
&lt;br /&gt;
Примеры библиотек, содержащих параллельную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Здесь приводятся как конкретные реализации, так и статьи, описывающие подходы к реализациям распараллеливания EM-алгоритма&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# [https://spark.apache.org/ Apache Spark]&lt;br /&gt;
# [http://accord-framework.net/ Accord.NET Framework (C#)]&lt;br /&gt;
# Статья об использовании FREERIDE middleware для распараллеливания EM алгоритма &amp;lt;ref name=FREERIDE/&amp;gt; &lt;br /&gt;
# [http://andrewharp.com/gmmcuda реализация с использованием CUDA]&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MPI еще одна реализация с использованием CUDA]&lt;br /&gt;
# статья об использовании параллельного EM алгоритма в задачах компьютерного зрения &amp;lt;ref name=CV/&amp;gt;&lt;br /&gt;
# статья о распараллеливании EM алгоритма с использованием CUDA &amp;lt;ref name=CUDA/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Noite</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:Noite/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=6774</id>
		<title>Участник:Noite/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:Noite/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=6774"/>
		<updated>2016-10-13T19:05:49Z</updated>

		<summary type="html">&lt;p&gt;Noite: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n * m^2 * k)&amp;lt;/math&amp;gt; - одна итерация&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n * m + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Noite|Зинченко Д.А.]]&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации, основанный на максимизации ожидания (EM-алгоритм)&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
В задачах оптимизации EM-алгоритмом называют итеративную процедуру поиска численного значения экстремума какой-либо функции. В частности, в статистике этот алгоритм используется для оценки максимального правдоподобия. Впервые название EM-алгоритм было предложено в 1977 году&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;, однако его идеи были описаны и раньше&amp;lt;ref name=korolev&amp;gt;В.Ю.Королёв. ЕМ-алгоритм, его модификации и их применение к задаче разделения смесей вероятностных распределений.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм применяется для решения задач двух типов &amp;lt;ref name=korolev/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Анализ неполных данных (данных с пропусками). &lt;br /&gt;
# Оценка максимального правдоподобия в случае, если функцию правдоподобия трудно исследовать аналитически. В этом случае введение набора скрытых переменных может существенно упростить задачу.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к задачам второго типа. В данной статье рассматривается следующая постановка задачи кластеризации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;Дано множество объектов, каждый из которых представляет собой точку в n-мерном метрическом пространстве. Каждому измерению пространства соответствует некоторое свойство объекта. Необходимо разбить это множество на k подмножеств так, чтобы, чтобы элементы каждого подмножества существенно отличались по свойствам от элементов других подмножеств.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование алгоритма EM подразумевает следующее &#039;&#039;предположение об объектах&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Пусть объекты, которые необходимо разбить на кластеры, появляются случайным образом и независимо друг от друга согласно вероятностному распределению, равному смеси (линейной комбинации) распределений кластеров. В данной статье в дальнейшем будет считаться, что распределение каждого кластера является многомерным нормальным распределением с произвольной матрицей ковариации - наиболее часто используемое предположение.&lt;br /&gt;
&lt;br /&gt;
Тогда каждый объект принадлежит каждому кластеру, но с разной вероятностью. EM-алгоритм итеративно оценивает параметры распределений кластеров, максимизируя логарифмическую функцию максимального правдоподобия. После окончания работы алгоритма объект будет отнесен к кластеру, вероятность принадлежности которому максимальна. Вводимый набор скрытых переменных для каждого объекта - вероятности того, что объект принадлежит каждому из кластеров.&lt;br /&gt;
&lt;br /&gt;
Итерация алгоритма состоит из двух последовательных шагов.&lt;br /&gt;
&lt;br /&gt;
# (Expectation) Вычисляются новые ожидаемые значения скрытых переменных.&lt;br /&gt;
# (Maximization) Решается задача максимизации правдоподобия: По текущим значениям скрытых переменных обновляются параметры распределений для кластеров: математическое ожидание, дисперсия и вероятность появления объектов из кластера.&lt;br /&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;N&amp;lt;/math&amp;gt; - количество объектов, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - количество параметров объекта&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\gamma_{n,k}&amp;lt;/math&amp;gt; - значения скрытых переменных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N_{k}&amp;lt;/math&amp;gt; - количество элементов отнесенных к соответствующему кластеру&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{1},...,x_n&amp;lt;/math&amp;gt; - объекты&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Параметры распределений:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{1},...,w_{k}&amp;lt;/math&amp;gt; - вероятности появления объектов из кластеров (веса кластеров), &amp;lt;math&amp;gt;\sum_{k=1}^Kw_{k}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{1},...,\mu_{k}&amp;lt;/math&amp;gt; - центры гауссиан кластеров&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma_{1},...,\Sigma_{k}&amp;lt;/math&amp;gt; - матрицы ковариации гауссиан кластеров, каждая матрица имеет размерность &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Смесь распределений:&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; P(x) = \sum_{j=1}^Kw_jp(x|\mu_{j}, \Sigma_{j})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Цель алгоритма - вычислить параметры распределений, максимизирующих логарифм функции правдоподобия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\ln P(x|w,\mu,\Sigma)= \sum_{n=1}^N \ln \{ \sum_{k=1}^K w_{k}p(x_{n}|\mu_{k},\Sigma_{k})\}&amp;lt;/math&amp;gt;.&amp;lt;/center&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
* В начале работы алгоритма задаются параметры начального приближения:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{i} = 1/K, \mu_{i} = random(x_{j}), i=1..K, j=1..N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{j,j}^{k}=\frac{1}{NK}\sum_{i=1}^N(x_{i,j} - \mu_{k,j})^2, k=1..K, j=1..M&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Поскольку от начального приближения может сильно зависеть результат работы алгоритма, вместо инициализации кластеров случайными центрами, равными весами и диагональными матрицами ковариации, как в приведенных формулах, часто применяют другие способы (подробнее - в [[#Особенности реализации последовательного алгоритма | особенностях реализации]])&#039;&#039;&lt;br /&gt;
* Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
** E-шаг: используя текущее значение параметров &amp;lt;math&amp;gt;w_{1},...,w_{k};\mu_{1},...,\mu_{k};\Sigma^{1},...,\Sigma^{k}&amp;lt;/math&amp;gt;, вычисляем значение вектора скрытых переменных &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\gamma_{n,k}=\frac{w_{k}p(x_{n}|\mu_{k},\Sigma^{k})}{\sum_{j=1}^K w_{j}p(x_{n}|\mu_{j},\Sigma^{j})}, &amp;lt;/math&amp;gt; знаменатель дроби - нормировочный коэффициент&amp;lt;/center&amp;gt;&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p(x|\mu,\Sigma)=\frac{1}{{(2\pi)}^{\frac{N}{2}}\sqrt{|\Sigma|}}exp\biggl\{-\frac{1}{2}{(x-\mu)}^T{\Sigma}^{-1}(x-\mu)\biggr\}&amp;lt;/math&amp;gt; - плотность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерного нормального распределения&amp;lt;/center&amp;gt;&lt;br /&gt;
** М-шаг: переоценка параметров по текущим значениям скрытых переменных для &amp;lt;math&amp;gt;k = 1..K&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\mu^{new}_{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k}x_{n}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{new}^{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k} (x_{n}-\mu_{k}^{new})(x_{n}-\mu_{k}^{new})^{T}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{k}^{new}=\frac{N_{k}}{N}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;N_{k}=\sum_{n=1}^N \gamma_{n,k}&amp;lt;/math&amp;gt;.&amp;lt;/center&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;
Вычислительное ядро алгоритма состоит из двух шагов, повторяющихся каждую итерацию:&lt;br /&gt;
*Обновление скрытых переменных на основе текущих параметров распределений&lt;br /&gt;
*Обновление параметров кластеров: весов, центров и матриц ковариации&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании вычислительного ядра алгоритма]], основную часть алгоритма составляют итеративно проводимые макрооперации: Expectation шаг - вычисление новых значений скрытых переменных, Maximization шаг - обновление параметров кластеров. Макроструктура алгоритма представлена на рисунке 1:&lt;br /&gt;
[[file:EM_macro.png|thumb|center|600px|Рисунок 1: Макроструктура EM-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Примерная схема реализации EM алгоритма с предварительной обработкой матриц ковариации:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
// n - количество объектов&lt;br /&gt;
&lt;br /&gt;
// m - количество координат объектов&lt;br /&gt;
&lt;br /&gt;
// k - количество кластеров&lt;br /&gt;
&lt;br /&gt;
Инициализировать веса и центры кластеров;&lt;br /&gt;
Инициализировать матрицы ковариации;&lt;br /&gt;
&lt;br /&gt;
// Основной цикл&lt;br /&gt;
Пока условие остановки не выполнено&lt;br /&gt;
    // E-шаг&lt;br /&gt;
    В цикле для каждого кластера&lt;br /&gt;
        Вычислить определитель матрицы ковариации Sigma;&lt;br /&gt;
        Вычислить обратную матрицу матрице Sigma;&lt;br /&gt;
    В цикле для каждого объекта&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Вычислить и запомнить p(x | mu, Sigma) для текущего объекта и кластера;&lt;br /&gt;
            Просуммировать вычисленные p(x | mu, Sigma);&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Обновить скрытые переменные gamma;&lt;br /&gt;
    // M-шаг&lt;br /&gt;
    Обновить веса w;&lt;br /&gt;
    Обновить центры кластеров mu;&lt;br /&gt;
    Обновить матрицы ковариации Sigma;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления определителя произвольной матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления матрицы, обратной произвольной матрице ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации - &amp;lt;math&amp;gt;O(k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С учетом заранее вычисленных определителей и обратных матриц сложность вычисления &amp;lt;math&amp;gt;p(x | \mu,\Sigma)&amp;lt;/math&amp;gt; составит: &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага E составит &amp;lt;math&amp;gt;O(n * m^2 * k + k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления весов кластеров &amp;lt;math&amp;gt;O(k * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления центров кластеров &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления одной матрицы ковариации &amp;lt;math&amp;gt;O(n * m)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления всех матриц ковариации &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага M алгоритма - &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит &amp;lt;math&amp;gt;O(k * m^2 * n + k * m^3 + k * m * n)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В предположении, что размерность объектов много меньше их количества &amp;lt;math&amp;gt;m &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt; получим сложность итерации &amp;lt;math&amp;gt;O(k * m^2 * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большУю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее - вынесены за основной цикл шага E&amp;lt;ref name=ParallelEMComparissonGraphLab&amp;gt;Henggang Cui, Jinliang Wei, Wei Dai. Parallel Implementation of Expectation-Maximization for Fast Convergence - School of Computer Science, Carnegie Mellon University. [https://users.ece.cmu.edu/~hengganc/archive/report/final.pdf]&amp;lt;/ref&amp;gt;. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм&amp;lt;ref&amp;gt;Вячеслав Орешков. EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, а суммарная сложность шага E и сложность всей итерации составит &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Макроструктура алгоритма представлена на рисунке 1 (см. [[#Макроструктура алгоритма|раздел 1.4]] статьи).&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 представлена схема вычислений E-шага алгоритма для одного объекта: для объекта &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и параметров &amp;lt;math&amp;gt;w_{j}, \mu_{j}, \Sigma_{j}, j=1..k&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются ненормированные значения скрытых переменных &amp;lt;math&amp;gt;g_{j}&amp;lt;/math&amp;gt;, нормировочный коэффициент &#039;&#039;normСoeff&#039;&#039;, и получаются итоговые значения &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step.png|thumb|center|400px|Рисунок 2: E-шаг EM алгоритма для одного объекта]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 представлена схема вычислений E-шага алгоритма для всех объектов: для объекта &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt; и параметров-векторов &amp;lt;math&amp;gt;w, \mu, \Sigma&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются значения скрытых переменных. &amp;lt;math&amp;gt;E_{i}, i=1..n&amp;lt;/math&amp;gt; - маркооперации, E-шаги для соответствующих объектов.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step_all.png|thumb|center|400px|Рисунок 3: E-шаг EM алгоритма для всех объектов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена схема вычислений M-шага алгоритма для одного кластера: для объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и скрытых переменных &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;, соответствующих степени принадлежности этих объектов кластеру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, согласно формулам шага M [[#Математическое описание алгоритма|раздела 1.2]] вычисляется нормировочный коэффициент &amp;lt;math&amp;gt;N_{j}&amp;lt;/math&amp;gt; и параметры этого кластера: вес &amp;lt;math&amp;gt;w_{j}^{new}&amp;lt;/math&amp;gt;, матрица ковариации &amp;lt;math&amp;gt;\Sigma_{j}^{new}&amp;lt;/math&amp;gt; и центр кластера &amp;lt;math&amp;gt;\mu_{j}^{new}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step.png|thumb|center|400px|Рисунок 4: M-шаг EM алгоритма для одного кластера]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена схема вычислений M-шага алгоритма для всех кластеров. &amp;lt;math&amp;gt;M_{j}, j=1..k&amp;lt;/math&amp;gt; соответствует макрооперации - M-шагу для соответствующего кластера и скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step_all.png|thumb|center|400px|Рисунок 5: M-шаг EM алгоритма для всех кластеров]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Из схем вычислений шагов E и M шагов алгоритма, приведенным в [[#Информационный граф|предыдущем разделе]], видно, что если размерность матрицы ковариации небольшая (тогда вычисление определителя и обратной матрицы матрице ковариации не является трудоемкой операцией), обе макрооперации EM алгоритма можно распараллеливать как по кластерам, так и по объектам.&lt;br /&gt;
&lt;br /&gt;
Как правило количество кластеров, на которые нужно разбить объекты, несравнимо меньше количества объектов, поэтому распараллеливание в большинстве существующих реализаций происходит по объектам: обработка объектов по возможности равномерно распределяются по кластерам. Теоретически (если считать передачу данных между процессорами мгновенной) при наличии неограниченного числа процессоров сложность алгоритма составит &amp;lt;math&amp;gt;O(m^2 * k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* Целое неотрицательное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
* Значения координат объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; объектов с &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; координатами каждый.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;n * m&amp;lt;/math&amp;gt; вещественных чисел (если координаты объектов - вещественные числа), &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целое неотрицательное число.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - для каждого объекта указан номер кластера, к которому он отнесен.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; целых неотрицательных чисел. &lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
=== Преимущества и недостатки ===&lt;br /&gt;
EM-алгоритм обладает следующими преимуществами и недостатками:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Преимущества:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Слабо чувствителен к выбросам&lt;br /&gt;
# Прост в реализации&lt;br /&gt;
# Быстро сходится при удачном выборе начальных значений параметров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Неустойчив к выбору начальных значений параметров - от них зависит как скорость сходимости, так и результат работы: алгоритм может сойтись к локальному экстремуму функции правдоподобия, который может быть существенно ниже глобального.&lt;br /&gt;
# Алгоритм не находит оптимальное количество кластеров. Количество кластеров, на которые нужно разбить множество объектов, является параметром алгоритма.&lt;br /&gt;
# При большой размерности пространства объектов выдвинутое предположение о модели их распределения может быть некорректным.&lt;br /&gt;
&lt;br /&gt;
=== Влияние структуры матрицы ковариации на форму кластера ===&lt;br /&gt;
&lt;br /&gt;
[[file:DifferentCovariance.png|thumb|center|800px|Рисунок 6: Влияние структуры матрицы ковариации на форму кластеров для двумерного случая. a) - матрицы ковариации являются диагональными, b) - матрицы ковариации произвольны. &amp;lt;ref&amp;gt;Mathworks: Clustering Using Gaussian Mixture Models [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 6 наглядно показывает, что при диагональной форме матриц ковариации полуоси эллипса (в общем случае - эллипсоида), соответствующего распределению объектов, отнесенных кластеру, параллельны осям координат объектов. В противном случае полуоси могут располагаться произвольным образом.&lt;br /&gt;
&lt;br /&gt;
=== Общие свойства ===&lt;br /&gt;
[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] EM алгоритма равна &amp;lt;math&amp;gt;m * k * it&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - размерность объекта, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров, а &amp;lt;math&amp;gt;it&amp;lt;/math&amp;gt; - количество итераций. &lt;br /&gt;
&lt;br /&gt;
EM-алгоритм является итерационным, и число итераций в общем случае не фиксировано: оно зависит от условий остановки, начальных приближений и расположения объектов. Поэтому этот алгоритм &#039;&#039;недетерминированный&#039;&#039;. По тем же причинам EM-алгоритм является &#039;&#039;неустойчивым&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Многие статьи&amp;lt;ref name=FREERIDE&amp;gt;Leonid Glimcher, Gagan Agrawal. Parallelising EM Algorithm on a Cluster of SMPs [http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CV&amp;gt;López-de-Teruel P. E., García J. M., Acacio; The Parallel EM Algorithm and its Applications in Computer Vision [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=MULTITHREAD&amp;gt;Sharon X. Lee, Kaleb L. Leemaqz, Geoffrey J. McLachlan. A simple multithreaded implementation of the EM algorithm for mixture models [https://arxiv.org/pdf/1606.02054.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CUDA&amp;gt;Araújo, G.F., H.T. Macedo, M.T. Chella, C.A.E. Montesco and M.V.O. Medeiros. PARALLEL IMPLEMENTATION OF EXPECTATION-MAXIMISATION ALGORITHM FOR THE TRAINING OF GAUSSIAN MIXTURE MODELS [https://ri.ufs.br/bitstream/123456789/1764/1/ExpectationMaximisationAlgorithm.pdf]&amp;lt;/ref&amp;gt;, в которых представлены параллельные реализации EM алгоритма, описывают помимо использующихся программных и аппаратных решений результаты проведенных экспериментов с данными. В качестве примера в этом разделе будут рассмотрены результаты эксперементов, проведенных со связующим программным обеспечением (&#039;&#039;middleware&#039;&#039;) FREERIDE&amp;lt;ref&amp;gt;Leonid Glimchera, Ruoming Jinb, Gagan Agrawala. Middleware for data mining applications on clusters and grids [http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf]&amp;lt;/ref&amp;gt; (FRamework for Rapid Implementation of Datamining Engines), обеспечивающим возможность распараллеливания как для систем с общей памятью (в частности, симметричных мультипроцессорных систем), так и для систем с распределенной памятью.&lt;br /&gt;
&lt;br /&gt;
Эксперименты проводились на кластере машин Pentium 700MHz связанных при помощи Myrinet&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Myrinet&amp;lt;/ref&amp;gt; LANai 7.0 на трех наборах данных: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;а)&#039;&#039;&#039; 3.3 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; 6.2 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; 12.5 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
Объекты представляют собой координаты точек 10-мерного пространства.&lt;br /&gt;
 &lt;br /&gt;
Количество машин в кластере варьировалось от 1 до 8, при этом на каждой машине запускалось до четырех параллельных потоков.&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов представлены на рисунках 7-9&amp;lt;ref name=FREERIDE/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_a.png|thumb|center|350px|Рисунок 7: набор данных a)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_b.png|thumb|center|357px|Рисунок 8: набор данных b)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_c.png|thumb|center|350px|Рисунок 9: набор данных c)]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что используемые в данном исследовании машины, как и коммуникационная среда, сейчас не используются и считаются устаревшими, результат приведенных экспериментов наглядно показывает, что EM алгоритм хорошо параллелится, зависимость ускорения от числа узлов в кластере с небольшим количеством узлов близка к линейной, а также, что скорость работы алгоритма линейно зависит от числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Данный раздел считается незавершенным и может дополняться&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Примеры библиотек, содержащих последовательную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV(C++)] ([https://github.com/opencv/opencv/blob/master/modules/ml/src/em.cpp github])&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab]&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html Scikit learn (Python)]&lt;br /&gt;
# [http://mlpack.org/index.html MLPack(C++)]&lt;br /&gt;
&lt;br /&gt;
Примеры библиотек, содержащих параллельную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Здесь приводятся как конкретные реализации, так и статьи, описывающие подходы к реализациям распараллеливания EM-алгоритма&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# [https://spark.apache.org/ Apache Spark]&lt;br /&gt;
# [http://accord-framework.net/ Accord.NET Framework (C#)]&lt;br /&gt;
# Статья об использовании FREERIDE middleware для распараллеливания EM алгоритма &amp;lt;ref name=FREERIDE/&amp;gt; &lt;br /&gt;
# [http://andrewharp.com/gmmcuda реализация с использованием CUDA]&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MPI еще одна реализация с использованием CUDA]&lt;br /&gt;
# статья об использовании параллельного EM алгоритма в задачах компьютерного зрения &amp;lt;ref name=CV/&amp;gt;&lt;br /&gt;
# статья о распараллеливании EM алгоритма с использованием CUDA &amp;lt;ref name=CUDA/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Noite</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:Noite/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=6773</id>
		<title>Участник:Noite/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:Noite/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=6773"/>
		<updated>2016-10-13T19:05:36Z</updated>

		<summary type="html">&lt;p&gt;Noite: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n * m^2 * k)&amp;lt;/math&amp;gt; - одна итерация&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n * m + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Noite|Зинченко Д.А.]]&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации, основанный на максимизации ожидания (EM-алгоритм)&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
В задачах оптимизации EM-алгоритмом называют итеративную процедуру поиска численного значения экстремума какой-либо функции. В частности, в статистике этот алгоритм используется для оценки максимального правдоподобия. Впервые название EM-алгоритм было предложено в 1977 году&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;, однако его идеи были описаны и раньше&amp;lt;ref name=korolev&amp;gt;В.Ю.Королёв. ЕМ-алгоритм, его модификации и их применение к задаче разделения смесей вероятностных распределений.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм применяется для решения задач двух типов &amp;lt;ref name=korolev/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Анализ неполных данных (данных с пропусками). &lt;br /&gt;
# Оценка максимального правдоподобия в случае, если функцию правдоподобия трудно исследовать аналитически. В этом случае введение набора скрытых переменных может существенно упростить задачу.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к задачам второго типа. В данной статье рассматривается следующая постановка задачи кластеризации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;Дано множество объектов, каждый из которых представляет собой точку в n-мерном метрическом пространстве. Каждому измерению пространства соответствует некоторое свойство объекта. Необходимо разбить это множество на k подмножеств так, чтобы, чтобы элементы каждого подмножества существенно отличались по свойствам от элементов других подмножеств.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование алгоритма EM подразумевает следующее &#039;&#039;предположение об объектах&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Пусть объекты, которые необходимо разбить на кластеры, появляются случайным образом и независимо друг от друга согласно вероятностному распределению, равному смеси (линейной комбинации) распределений кластеров. В данной статье в дальнейшем будет считаться, что распределение каждого кластера является многомерным нормальным распределением с произвольной матрицей ковариации - наиболее часто используемое предположение.&lt;br /&gt;
&lt;br /&gt;
Тогда каждый объект принадлежит каждому кластеру, но с разной вероятностью. EM-алгоритм итеративно оценивает параметры распределений кластеров, максимизируя логарифмическую функцию максимального правдоподобия. После окончания работы алгоритма объект будет отнесен к кластеру, вероятность принадлежности которому максимальна. Вводимый набор скрытых переменных для каждого объекта - вероятности того, что объект принадлежит каждому из кластеров.&lt;br /&gt;
&lt;br /&gt;
Итерация алгоритма состоит из двух последовательных шагов.&lt;br /&gt;
&lt;br /&gt;
# (Expectation) Вычисляются новые ожидаемые значения скрытых переменных.&lt;br /&gt;
# (Maximization) Решается задача максимизации правдоподобия: По текущим значениям скрытых переменных обновляются параметры распределений для кластеров: математическое ожидание, дисперсия и вероятность появления объектов из кластера.&lt;br /&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;N&amp;lt;/math&amp;gt; - количество объектов, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - количество параметров объекта&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\gamma_{n,k}&amp;lt;/math&amp;gt; - значения скрытых переменных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N_{k}&amp;lt;/math&amp;gt; - количество элементов отнесенных к соответствующему кластеру&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{1},...,x_n&amp;lt;/math&amp;gt; - объекты&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Параметры распределений:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{1},...,w_{k}&amp;lt;/math&amp;gt; - вероятности появления объектов из кластеров (веса кластеров), &amp;lt;math&amp;gt;\sum_{k=1}^Kw_{k}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{1},...,\mu_{k}&amp;lt;/math&amp;gt; - центры гауссиан кластеров&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma_{1},...,\Sigma_{k}&amp;lt;/math&amp;gt; - матрицы ковариации гауссиан кластеров, каждая матрица имеет размерность &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Смесь распределений:&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; P(x) = \sum_{j=1}^Kw_jp(x|\mu_{j}, \Sigma_{j})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Цель алгоритма - вычислить параметры распределений, максимизирующих логарифм функции правдоподобия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\ln P(x|w,\mu,\Sigma)= \sum_{n=1}^N \ln \{ \sum_{k=1}^K w_{k}p(x_{n}|\mu_{k},\Sigma_{k})\}&amp;lt;/math&amp;gt;.&amp;lt;/center&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
* В начале работы алгоритма задаются параметры начального приближения:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{i} = 1/K, \mu_{i} = random(x_{j}), i=1..K, j=1..N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{j,j}^{k}=\frac{1}{NK}\sum_{i=1}^N(x_{i,j} - \mu_{k,j})^2, k=1..K, j=1..M&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Поскольку от начального приближения может сильно зависеть результат работы алгоритма, вместо инициализации кластеров случайными центрами, равными весами и диагональными матрицами ковариации, как в приведенных формулах, часто применяют другие способы (подробнее - в [[#Особенности реализации последовательного алгоритма | особенностях реализации]])&#039;&#039;&lt;br /&gt;
* Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
** E-шаг: используя текущее значение параметров &amp;lt;math&amp;gt;w_{1},...,w_{k};\mu_{1},...,\mu_{k};\Sigma^{1},...,\Sigma^{k}&amp;lt;/math&amp;gt;, вычисляем значение вектора скрытых переменных &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\gamma_{n,k}=\frac{w_{k}p(x_{n}|\mu_{k},\Sigma^{k})}{\sum_{j=1}^K w_{j}p(x_{n}|\mu_{j},\Sigma^{j})}, &amp;lt;/math&amp;gt; знаменатель дроби - нормировочный коэффициент&amp;lt;/center&amp;gt;&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p(x|\mu,\Sigma)=\frac{1}{{(2\pi)}^{\frac{N}{2}}\sqrt{|\Sigma|}}exp\biggl\{-\frac{1}{2}{(x-\mu)}^T{\Sigma}^{-1}(x-\mu)\biggr\}&amp;lt;/math&amp;gt; - плотность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерного нормального распределения&amp;lt;/center&amp;gt;&lt;br /&gt;
** М-шаг: переоценка параметров по текущим значениям скрытых переменных для &amp;lt;math&amp;gt;k = 1..K&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\mu^{new}_{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k}x_{n}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{new}^{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k} (x_{n}-\mu_{k}^{new})(x_{n}-\mu_{k}^{new})^{T}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{k}^{new}=\frac{N_{k}}{N}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;N_{k}=\sum_{n=1}^N \gamma_{n,k}&amp;lt;/math&amp;gt;.&amp;lt;/center&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;
Вычислительное ядро алгоритма состоит из двух шагов, повторяющихся каждую итерацию:&lt;br /&gt;
*Обновление скрытых переменных на основе текущих параметров распределений&lt;br /&gt;
*Обновление параметров кластеров: весов, центров и матриц ковариации&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании вычислительного ядра алгоритма]], основную часть алгоритма составляют итеративно проводимые макрооперации: Expectation шаг - вычисление новых значений скрытых переменных, Maximization шаг - обновление параметров кластеров. Макроструктура алгоритма представлена на рисунке 1:&lt;br /&gt;
[[file:EM_macro.png|thumb|center|600px|Рисунок 1: Макроструктура EM-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Примерная схема реализации EM алгоритма с предварительной обработкой матриц ковариации:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
// n - количество объектов&lt;br /&gt;
&lt;br /&gt;
// m - количество координат объектов&lt;br /&gt;
&lt;br /&gt;
// k - количество кластеров&lt;br /&gt;
&lt;br /&gt;
Инициализировать веса и центры кластеров;&lt;br /&gt;
Инициализировать матрицы ковариации;&lt;br /&gt;
&lt;br /&gt;
// Основной цикл&lt;br /&gt;
Пока условие остановки не выполнено&lt;br /&gt;
    // E-шаг&lt;br /&gt;
    В цикле для каждого кластера&lt;br /&gt;
        Вычислить определитель матрицы ковариации Sigma;&lt;br /&gt;
        Вычислить обратную матрицу матрице Sigma;&lt;br /&gt;
    В цикле для каждого объекта&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Вычислить и запомнить p(x | mu, Sigma) для текущего объекта и кластера;&lt;br /&gt;
            Просуммировать вычисленные p(x | mu, Sigma);&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Обновить скрытые переменные gamma;&lt;br /&gt;
    // M-шаг&lt;br /&gt;
    Обновить веса w;&lt;br /&gt;
    Обновить центры кластеров mu;&lt;br /&gt;
    Обновить матрицы ковариации Sigma;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления определителя произвольной матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления матрицы, обратной произвольной матрице ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации - &amp;lt;math&amp;gt;O(k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С учетом заранее вычисленных определителей и обратных матриц сложность вычисления &amp;lt;math&amp;gt;p(x | \mu,\Sigma)&amp;lt;/math&amp;gt; составит: &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага E составит &amp;lt;math&amp;gt;O(n * m^2 * k + k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления весов кластеров &amp;lt;math&amp;gt;O(k * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления центров кластеров &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления одной матрицы ковариации &amp;lt;math&amp;gt;O(n * m)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления всех матриц ковариации &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага M алгоритма - &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит &amp;lt;math&amp;gt;O(k * m^2 * n + k * m^3 + k * m * n)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В предположении, что размерность объектов много меньше их количества &amp;lt;math&amp;gt;m &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt; получим сложность итерации &amp;lt;math&amp;gt;O(k * m^2 * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большУю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее - вынесены за основной цикл шага E&amp;lt;ref name=ParallelEMComparissonGraphLab&amp;gt;Henggang Cui, Jinliang Wei, Wei Dai. Parallel Implementation of Expectation-Maximization for Fast Convergence - School of Computer Science, Carnegie Mellon University. [https://users.ece.cmu.edu/~hengganc/archive/report/final.pdf]&amp;lt;/ref&amp;gt;. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм&amp;lt;ref&amp;gt;Вячеслав Орешков. EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, а суммарная сложность шага E и сложность всей итерации составит &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Макроструктура алгоритма представлена на рисунке 1 (см. [[#Макроструктура алгоритма|раздел 1.4]] статьи).&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 представлена схема вычислений E-шага алгоритма для одного объекта: для объекта &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и параметров &amp;lt;math&amp;gt;w_{j}, \mu_{j}, \Sigma_{j}, j=1..k&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются ненормированные значения скрытых переменных &amp;lt;math&amp;gt;g_{j}&amp;lt;/math&amp;gt;, нормировочный коэффициент &#039;&#039;normСoeff&#039;&#039;, и получаются итоговые значения &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step.png|thumb|center|400px|Рисунок 2: E-шаг EM алгоритма для одного объекта]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 представлена схема вычислений E-шага алгоритма для всех объектов: для объекта &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt; и параметров-векторов &amp;lt;math&amp;gt;w, \mu, \Sigma&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются значения скрытых переменных. &amp;lt;math&amp;gt;E_{i}, i=1..n&amp;lt;/math&amp;gt; - маркооперации, E-шаги для соответствующих объектов.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step_all.png|thumb|center|400px|Рисунок 3: E-шаг EM алгоритма для всех объектов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена схема вычислений M-шага алгоритма для одного кластера: для объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и скрытых переменных &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;, соответствующих степени принадлежности этих объектов кластеру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, согласно формулам шага M [[#Математическое описание алгоритма|раздела 1.2]] вычисляется нормировочный коэффициент &amp;lt;math&amp;gt;N_{j}&amp;lt;/math&amp;gt; и параметры этого кластера: вес &amp;lt;math&amp;gt;w_{j}^{new}&amp;lt;/math&amp;gt;, матрица ковариации &amp;lt;math&amp;gt;\Sigma_{j}^{new}&amp;lt;/math&amp;gt; и центр кластера &amp;lt;math&amp;gt;\mu_{j}^{new}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step.png|thumb|center|400px|Рисунок 4: M-шаг EM алгоритма для одного кластера]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена схема вычислений M-шага алгоритма для всех кластеров. &amp;lt;math&amp;gt;M_{j}, j=1..k&amp;lt;/math&amp;gt; соответствует макрооперации - M-шагу для соответствующего кластера и скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step_all.png|thumb|center|400px|Рисунок 5: M-шаг EM алгоритма для всех кластеров]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Из схем вычислений шагов E и M шагов алгоритма, приведенным в [[#Информационный граф|предыдущем разделе]], видно, что если размерность матрицы ковариации небольшая (тогда вычисление определителя и обратной матрицы матрице ковариации не является трудоемкой операцией), обе макрооперации EM алгоритма можно распараллеливать как по кластерам, так и по объектам.&lt;br /&gt;
&lt;br /&gt;
Как правило количество кластеров, на которые нужно разбить объекты, несравнимо меньше количества объектов, поэтому распараллеливание в большинстве существующих реализаций происходит по объектам: обработка объектов по возможности равномерно распределяются по кластерам. Теоретически (если считать передачу данных между процессорами мгновенной) при наличии неограниченного числа процессоров сложность алгоритма составит &amp;lt;math&amp;gt;O(m^2 * k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* Целое неотрицательное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
* Значения координат объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; объектов с &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; координатами каждый.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;n * m&amp;lt;/math&amp;gt; вещественных чисел (если координаты объектов - вещественные числа), &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целое неотрицательное число.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - для каждого объекта указан номер кластера, к которому он отнесен.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; целых неотрицательных чисел. &lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
=== Преимущества и недостатки ===&lt;br /&gt;
EM-алгоритм обладает следующими преимуществами и недостатками:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Преимущества:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Слабо чувствителен к выбросам&lt;br /&gt;
# Прост в реализации&lt;br /&gt;
# Быстро сходится при удачном выборе начальных значений параметров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Неустойчив к выбору начальных значений параметров - от них зависит как скорость сходимости, так и результат работы: алгоритм может сойтись к локальному экстремуму функции правдоподобия, который может быть существенно ниже глобального.&lt;br /&gt;
# Алгоритм не находит оптимальное количество кластеров. Количество кластеров, на которые нужно разбить множество объектов, является параметром алгоритма.&lt;br /&gt;
# При большой размерности пространства объектов выдвинутое предположение о модели их распределения может быть некорректным.&lt;br /&gt;
&lt;br /&gt;
=== Влияние структуры матрицы ковариации на форму кластера ===&lt;br /&gt;
&lt;br /&gt;
[[file:DifferentCovariance.png|thumb|center|800px|Рисунок 6: Влияние структуры матрицы ковариации на форму кластеров для двумерного случая. a) - матрицы ковариации являются диагональными, b) - матрицы ковариации произвольны. &amp;lt;ref&amp;gt;Mathworks: Clustering Using Gaussian Mixture Models [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 6 наглядно показывает, что при диагональной форме матриц ковариации полуоси эллипса (в общем случае - эллипсоида), соответствующего распределению объектов, отнесенных кластеру, параллельны осям координат объектов. В противном случае полуоси могут располагаться произвольным образом.&lt;br /&gt;
&lt;br /&gt;
=== Общие свойства ===&lt;br /&gt;
[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] EM алгоритма равна &amp;lt;math&amp;gt;m * k * it&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - размерность объекта, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров, а &amp;lt;math&amp;gt;it&amp;lt;/math&amp;gt; - количество итераций. &lt;br /&gt;
&lt;br /&gt;
EM-алгоритм является итерационным, и число итераций в общем случае не фиксировано: оно зависит от условий остановки, начальных приближений и расположения объектов. Поэтому этот алгоритм &#039;&#039;недетерминированный&#039;&#039;. По тем же причинам EM-алгоритм является &#039;&#039;неустойчивым&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Многие статьи&amp;lt;ref name=FREERIDE&amp;gt;Leonid Glimcher, Gagan Agrawal. Parallelising EM Algorithm on a Cluster of SMPs [http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CV&amp;gt;López-de-Teruel P. E., García J. M., Acacio; The Parallel EM Algorithm and its Applications in Computer Vision [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=MULTITHREAD&amp;gt;Sharon X. Lee, Kaleb L. Leemaqz, Geoffrey J. McLachlan. A simple multithreaded implementation of the EM algorithm for mixture models [https://arxiv.org/pdf/1606.02054.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CUDA&amp;gt;Araújo, G.F., H.T. Macedo, M.T. Chella, C.A.E. Montesco and M.V.O. Medeiros. PARALLEL IMPLEMENTATION OF EXPECTATION-MAXIMISATION ALGORITHM FOR THE TRAINING OF GAUSSIAN MIXTURE MODELS [https://ri.ufs.br/bitstream/123456789/1764/1/ExpectationMaximisationAlgorithm.pdf]&amp;lt;/ref&amp;gt;, в которых представлены параллельные реализации EM алгоритма, описывают помимо использующихся программных и аппаратных решений результаты проведенных экспериментов с данными. В качестве примера в этом разделе будут рассмотрены результаты эксперементов, проведенных со связующим программным обеспечением (&#039;&#039;middleware&#039;&#039;) FREERIDE&amp;lt;ref&amp;gt;Leonid Glimchera, Ruoming Jinb, Gagan Agrawala. Middleware for data mining applications on clusters and grids [http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf]&amp;lt;/ref&amp;gt; (FRamework for Rapid Implementation of Datamining Engines), обеспечивающим возможность распараллеливания как для систем с общей памятью (в частности, симметричных мультипроцессорных систем), так и для систем с распределенной памятью.&lt;br /&gt;
&lt;br /&gt;
Эксперименты проводились на кластере машин Pentium 700MHz связанных при помощи Myrinet&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Myrinet&amp;lt;/ref&amp;gt; LANai 7.0 на трех наборах данных: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;а)&#039;&#039;&#039; 3.3 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; 6.2 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; 12.5 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
Объекты представляют собой координаты точек 10-мерного пространства.&lt;br /&gt;
 &lt;br /&gt;
Количество машин в кластере варьировалось от 1 до 8, при этом на каждой машине запускалось до четырех параллельных потоков.&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов представлены на рисунках 7-9&amp;lt;ref name=FREERIDE/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_a.png|thumb|center|350px|Рисунок 7: набор данных a)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_b.png|thumb|center|360px|Рисунок 8: набор данных b)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_c.png|thumb|center|350px|Рисунок 9: набор данных c)]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что используемые в данном исследовании машины, как и коммуникационная среда, сейчас не используются и считаются устаревшими, результат приведенных экспериментов наглядно показывает, что EM алгоритм хорошо параллелится, зависимость ускорения от числа узлов в кластере с небольшим количеством узлов близка к линейной, а также, что скорость работы алгоритма линейно зависит от числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Данный раздел считается незавершенным и может дополняться&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Примеры библиотек, содержащих последовательную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV(C++)] ([https://github.com/opencv/opencv/blob/master/modules/ml/src/em.cpp github])&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab]&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html Scikit learn (Python)]&lt;br /&gt;
# [http://mlpack.org/index.html MLPack(C++)]&lt;br /&gt;
&lt;br /&gt;
Примеры библиотек, содержащих параллельную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Здесь приводятся как конкретные реализации, так и статьи, описывающие подходы к реализациям распараллеливания EM-алгоритма&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# [https://spark.apache.org/ Apache Spark]&lt;br /&gt;
# [http://accord-framework.net/ Accord.NET Framework (C#)]&lt;br /&gt;
# Статья об использовании FREERIDE middleware для распараллеливания EM алгоритма &amp;lt;ref name=FREERIDE/&amp;gt; &lt;br /&gt;
# [http://andrewharp.com/gmmcuda реализация с использованием CUDA]&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MPI еще одна реализация с использованием CUDA]&lt;br /&gt;
# статья об использовании параллельного EM алгоритма в задачах компьютерного зрения &amp;lt;ref name=CV/&amp;gt;&lt;br /&gt;
# статья о распараллеливании EM алгоритма с использованием CUDA &amp;lt;ref name=CUDA/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Noite</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:Noite/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=6769</id>
		<title>Участник:Noite/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:Noite/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=6769"/>
		<updated>2016-10-13T19:03:12Z</updated>

		<summary type="html">&lt;p&gt;Noite: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n * m^2 * k)&amp;lt;/math&amp;gt; - одна итерация&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n * m + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Noite|Зинченко Д.А.]]&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации, основанный на максимизации ожидания (EM-алгоритм)&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
В задачах оптимизации EM-алгоритмом называют итеративную процедуру поиска численного значения экстремума какой-либо функции. В частности, в статистике этот алгоритм используется для оценки максимального правдоподобия. Впервые название EM-алгоритм было предложено в 1977 году&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;, однако его идеи были описаны и раньше&amp;lt;ref name=korolev&amp;gt;В.Ю.Королёв. ЕМ-алгоритм, его модификации и их применение к задаче разделения смесей вероятностных распределений.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм применяется для решения задач двух типов &amp;lt;ref name=korolev/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Анализ неполных данных (данных с пропусками). &lt;br /&gt;
# Оценка максимального правдоподобия в случае, если функцию правдоподобия трудно исследовать аналитически. В этом случае введение набора скрытых переменных может существенно упростить задачу.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к задачам второго типа. В данной статье рассматривается следующая постановка задачи кластеризации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;Дано множество объектов, каждый из которых представляет собой точку в n-мерном метрическом пространстве. Каждому измерению пространства соответствует некоторое свойство объекта. Необходимо разбить это множество на k подмножеств так, чтобы, чтобы элементы каждого подмножества существенно отличались по свойствам от элементов других подмножеств.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование алгоритма EM подразумевает следующее &#039;&#039;предположение об объектах&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Пусть объекты, которые необходимо разбить на кластеры, появляются случайным образом и независимо друг от друга согласно вероятностному распределению, равному смеси (линейной комбинации) распределений кластеров. В данной статье в дальнейшем будет считаться, что распределение каждого кластера является многомерным нормальным распределением с произвольной матрицей ковариации - наиболее часто используемое предположение.&lt;br /&gt;
&lt;br /&gt;
Тогда каждый объект принадлежит каждому кластеру, но с разной вероятностью. EM-алгоритм итеративно оценивает параметры распределений кластеров, максимизируя логарифмическую функцию максимального правдоподобия. После окончания работы алгоритма объект будет отнесен к кластеру, вероятность принадлежности которому максимальна. Вводимый набор скрытых переменных для каждого объекта - вероятности того, что объект принадлежит каждому из кластеров.&lt;br /&gt;
&lt;br /&gt;
Итерация алгоритма состоит из двух последовательных шагов.&lt;br /&gt;
&lt;br /&gt;
# (Expectation) Вычисляются новые ожидаемые значения скрытых переменных.&lt;br /&gt;
# (Maximization) Решается задача максимизации правдоподобия: По текущим значениям скрытых переменных обновляются параметры распределений для кластеров: математическое ожидание, дисперсия и вероятность появления объектов из кластера.&lt;br /&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;N&amp;lt;/math&amp;gt; - количество объектов, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - количество параметров объекта&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\gamma_{n,k}&amp;lt;/math&amp;gt; - значения скрытых переменных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N_{k}&amp;lt;/math&amp;gt; - количество элементов отнесенных к соответствующему кластеру&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{1},...,x_n&amp;lt;/math&amp;gt; - объекты&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Параметры распределений:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{1},...,w_{k}&amp;lt;/math&amp;gt; - вероятности появления объектов из кластеров (веса кластеров), &amp;lt;math&amp;gt;\sum_{k=1}^Kw_{k}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{1},...,\mu_{k}&amp;lt;/math&amp;gt; - центры гауссиан кластеров&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma_{1},...,\Sigma_{k}&amp;lt;/math&amp;gt; - матрицы ковариации гауссиан кластеров, каждая матрица имеет размерность &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Смесь распределений:&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; P(x) = \sum_{j=1}^Kw_jp(x|\mu_{j}, \Sigma_{j})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Цель алгоритма - вычислить параметры распределений, максимизирующих логарифм функции правдоподобия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\ln P(x|w,\mu,\Sigma)= \sum_{n=1}^N \ln \{ \sum_{k=1}^K w_{k}p(x_{n}|\mu_{k},\Sigma_{k})\}&amp;lt;/math&amp;gt;.&amp;lt;/center&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
* В начале работы алгоритма задаются параметры начального приближения:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{i} = 1/K, \mu_{i} = random(x_{j}), i=1..K, j=1..N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{j,j}^{k}=\frac{1}{NK}\sum_{i=1}^N(x_{i,j} - \mu_{k,j})^2, k=1..K, j=1..M&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Поскольку от начального приближения может сильно зависеть результат работы алгоритма, вместо инициализации кластеров случайными центрами, равными весами и диагональными матрицами ковариации, как в приведенных формулах, часто применяют другие способы (подробнее - в [[#Особенности реализации последовательного алгоритма | особенностях реализации]])&#039;&#039;&lt;br /&gt;
* Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
** E-шаг: используя текущее значение параметров &amp;lt;math&amp;gt;w_{1},...,w_{k};\mu_{1},...,\mu_{k};\Sigma^{1},...,\Sigma^{k}&amp;lt;/math&amp;gt;, вычисляем значение вектора скрытых переменных &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\gamma_{n,k}=\frac{w_{k}p(x_{n}|\mu_{k},\Sigma^{k})}{\sum_{j=1}^K w_{j}p(x_{n}|\mu_{j},\Sigma^{j})}, &amp;lt;/math&amp;gt; знаменатель дроби - нормировочный коэффициент&amp;lt;/center&amp;gt;&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p(x|\mu,\Sigma)=\frac{1}{{(2\pi)}^{\frac{N}{2}}\sqrt{|\Sigma|}}exp\biggl\{-\frac{1}{2}{(x-\mu)}^T{\Sigma}^{-1}(x-\mu)\biggr\}&amp;lt;/math&amp;gt; - плотность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерного нормального распределения&amp;lt;/center&amp;gt;&lt;br /&gt;
** М-шаг: переоценка параметров по текущим значениям скрытых переменных для &amp;lt;math&amp;gt;k = 1..K&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\mu^{new}_{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k}x_{n}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{new}^{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k} (x_{n}-\mu_{k}^{new})(x_{n}-\mu_{k}^{new})^{T}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{k}^{new}=\frac{N_{k}}{N}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;N_{k}=\sum_{n=1}^N \gamma_{n,k}&amp;lt;/math&amp;gt;.&amp;lt;/center&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;
Вычислительное ядро алгоритма состоит из двух шагов, повторяющихся каждую итерацию:&lt;br /&gt;
*Обновление скрытых переменных на основе текущих параметров распределений&lt;br /&gt;
*Обновление параметров кластеров: весов, центров и матриц ковариации&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании вычислительного ядра алгоритма]], основную часть алгоритма составляют итеративно проводимые макрооперации: Expectation шаг - вычисление новых значений скрытых переменных, Maximization шаг - обновление параметров кластеров. Макроструктура алгоритма представлена на рисунке 1:&lt;br /&gt;
[[file:EM_macro.png|thumb|center|600px|Рисунок 1: Макроструктура EM-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Примерная схема реализации EM алгоритма с предварительной обработкой матриц ковариации:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
// n - количество объектов&lt;br /&gt;
&lt;br /&gt;
// m - количество координат объектов&lt;br /&gt;
&lt;br /&gt;
// k - количество кластеров&lt;br /&gt;
&lt;br /&gt;
Инициализировать веса и центры кластеров;&lt;br /&gt;
Инициализировать матрицы ковариации;&lt;br /&gt;
&lt;br /&gt;
// Основной цикл&lt;br /&gt;
Пока условие остановки не выполнено&lt;br /&gt;
    // E-шаг&lt;br /&gt;
    В цикле для каждого кластера&lt;br /&gt;
        Вычислить определитель матрицы ковариации Sigma;&lt;br /&gt;
        Вычислить обратную матрицу матрице Sigma;&lt;br /&gt;
    В цикле для каждого объекта&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Вычислить и запомнить p(x | mu, Sigma) для текущего объекта и кластера;&lt;br /&gt;
            Просуммировать вычисленные p(x | mu, Sigma);&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Обновить скрытые переменные gamma;&lt;br /&gt;
    // M-шаг&lt;br /&gt;
    Обновить веса w;&lt;br /&gt;
    Обновить центры кластеров mu;&lt;br /&gt;
    Обновить матрицы ковариации Sigma;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления определителя произвольной матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления матрицы, обратной произвольной матрице ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации - &amp;lt;math&amp;gt;O(k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С учетом заранее вычисленных определителей и обратных матриц сложность вычисления &amp;lt;math&amp;gt;p(x | \mu,\Sigma)&amp;lt;/math&amp;gt; составит: &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага E составит &amp;lt;math&amp;gt;O(n * m^2 * k + k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления весов кластеров &amp;lt;math&amp;gt;O(k * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления центров кластеров &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления одной матрицы ковариации &amp;lt;math&amp;gt;O(n * m)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления всех матриц ковариации &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага M алгоритма - &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит &amp;lt;math&amp;gt;O(k * m^2 * n + k * m^3 + k * m * n)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В предположении, что размерность объектов много меньше их количества &amp;lt;math&amp;gt;m &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt; получим сложность итерации &amp;lt;math&amp;gt;O(k * m^2 * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большУю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее - вынесены за основной цикл шага E&amp;lt;ref name=ParallelEMComparissonGraphLab&amp;gt;Henggang Cui, Jinliang Wei, Wei Dai. Parallel Implementation of Expectation-Maximization for Fast Convergence - School of Computer Science, Carnegie Mellon University. [https://users.ece.cmu.edu/~hengganc/archive/report/final.pdf]&amp;lt;/ref&amp;gt;. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм&amp;lt;ref&amp;gt;Вячеслав Орешков. EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, а суммарная сложность шага E и сложность всей итерации составит &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Макроструктура алгоритма представлена на рисунке 1 (см. [[#Макроструктура алгоритма|раздел 1.4]] статьи).&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 представлена схема вычислений E-шага алгоритма для одного объекта: для объекта &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и параметров &amp;lt;math&amp;gt;w_{j}, \mu_{j}, \Sigma_{j}, j=1..k&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются ненормированные значения скрытых переменных &amp;lt;math&amp;gt;g_{j}&amp;lt;/math&amp;gt;, нормировочный коэффициент &#039;&#039;normСoeff&#039;&#039;, и получаются итоговые значения &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step.png|thumb|center|400px|Рисунок 2: E-шаг EM алгоритма для одного объекта]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 представлена схема вычислений E-шага алгоритма для всех объектов: для объекта &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt; и параметров-векторов &amp;lt;math&amp;gt;w, \mu, \Sigma&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются значения скрытых переменных. &amp;lt;math&amp;gt;E_{i}, i=1..n&amp;lt;/math&amp;gt; - маркооперации, E-шаги для соответствующих объектов.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step_all.png|thumb|center|400px|Рисунок 3: E-шаг EM алгоритма для всех объектов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена схема вычислений M-шага алгоритма для одного кластера: для объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и скрытых переменных &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;, соответствующих степени принадлежности этих объектов кластеру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, согласно формулам шага M [[#Математическое описание алгоритма|раздела 1.2]] вычисляется нормировочный коэффициент &amp;lt;math&amp;gt;N_{j}&amp;lt;/math&amp;gt; и параметры этого кластера: вес &amp;lt;math&amp;gt;w_{j}^{new}&amp;lt;/math&amp;gt;, матрица ковариации &amp;lt;math&amp;gt;\Sigma_{j}^{new}&amp;lt;/math&amp;gt; и центр кластера &amp;lt;math&amp;gt;\mu_{j}^{new}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step.png|thumb|center|400px|Рисунок 4: M-шаг EM алгоритма для одного кластера]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена схема вычислений M-шага алгоритма для всех кластеров. &amp;lt;math&amp;gt;M_{j}, j=1..k&amp;lt;/math&amp;gt; соответствует макрооперации - M-шагу для соответствующего кластера и скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step_all.png|thumb|center|400px|Рисунок 5: M-шаг EM алгоритма для всех кластеров]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Из схем вычислений шагов E и M шагов алгоритма, приведенным в [[#Информационный граф|предыдущем разделе]], видно, что если размерность матрицы ковариации небольшая (тогда вычисление определителя и обратной матрицы матрице ковариации не является трудоемкой операцией), обе макрооперации EM алгоритма можно распараллеливать как по кластерам, так и по объектам.&lt;br /&gt;
&lt;br /&gt;
Как правило количество кластеров, на которые нужно разбить объекты, несравнимо меньше количества объектов, поэтому распараллеливание в большинстве существующих реализаций происходит по объектам: обработка объектов по возможности равномерно распределяются по кластерам. Теоретически (если считать передачу данных между процессорами мгновенной) при наличии неограниченного числа процессоров сложность алгоритма составит &amp;lt;math&amp;gt;O(m^2 * k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* Целое неотрицательное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
* Значения координат объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; объектов с &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; координатами каждый.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;n * m&amp;lt;/math&amp;gt; вещественных чисел (если координаты объектов - вещественные числа), &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целое неотрицательное число.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - для каждого объекта указан номер кластера, к которому он отнесен.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; целых неотрицательных чисел. &lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
=== Преимущества и недостатки ===&lt;br /&gt;
EM-алгоритм обладает следующими преимуществами и недостатками:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Преимущества:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Слабо чувствителен к выбросам&lt;br /&gt;
# Прост в реализации&lt;br /&gt;
# Быстро сходится при удачном выборе начальных значений параметров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Неустойчив к выбору начальных значений параметров - от них зависит как скорость сходимости, так и результат работы: алгоритм может сойтись к локальному экстремуму функции правдоподобия, который может быть существенно ниже глобального.&lt;br /&gt;
# Алгоритм не находит оптимальное количество кластеров. Количество кластеров, на которые нужно разбить множество объектов, является параметром алгоритма.&lt;br /&gt;
# При большой размерности пространства объектов выдвинутое предположение о модели их распределения может быть некорректным.&lt;br /&gt;
&lt;br /&gt;
=== Влияние структуры матрицы ковариации на форму кластера ===&lt;br /&gt;
&lt;br /&gt;
[[file:DifferentCovariance.png|thumb|center|800px|Рисунок 6: Влияние структуры матрицы ковариации на форму кластеров для двумерного случая. a) - матрицы ковариации являются диагональными, b) - матрицы ковариации произвольны. &amp;lt;ref&amp;gt;Mathworks: Clustering Using Gaussian Mixture Models [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 6 наглядно показывает, что при диагональной форме матриц ковариации полуоси эллипса (в общем случае - эллипсоида), соответствующего распределению объектов, отнесенных кластеру, параллельны осям координат объектов. В противном случае полуоси могут располагаться произвольным образом.&lt;br /&gt;
&lt;br /&gt;
=== Общие свойства ===&lt;br /&gt;
[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] EM алгоритма равна &amp;lt;math&amp;gt;m * k * it&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - размерность объекта, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров, а &amp;lt;math&amp;gt;it&amp;lt;/math&amp;gt; - количество итераций. &lt;br /&gt;
&lt;br /&gt;
EM-алгоритм является итерационным, и число итераций в общем случае не фиксировано: оно зависит от условий остановки, начальных приближений и расположения объектов. Поэтому этот алгоритм &#039;&#039;недетерминированный&#039;&#039;. По тем же причинам EM-алгоритм является &#039;&#039;неустойчивым&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Многие статьи&amp;lt;ref name=FREERIDE&amp;gt;Leonid Glimcher, Gagan Agrawal. Parallelising EM Algorithm on a Cluster of SMPs [http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CV&amp;gt;López-de-Teruel P. E., García J. M., Acacio; The Parallel EM Algorithm and its Applications in Computer Vision [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=MULTITHREAD&amp;gt;Sharon X. Lee, Kaleb L. Leemaqz, Geoffrey J. McLachlan. A simple multithreaded implementation of the EM algorithm for mixture models [https://arxiv.org/pdf/1606.02054.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CUDA&amp;gt;Araújo, G.F., H.T. Macedo, M.T. Chella, C.A.E. Montesco and M.V.O. Medeiros. PARALLEL IMPLEMENTATION OF EXPECTATION-MAXIMISATION ALGORITHM FOR THE TRAINING OF GAUSSIAN MIXTURE MODELS [https://ri.ufs.br/bitstream/123456789/1764/1/ExpectationMaximisationAlgorithm.pdf]&amp;lt;/ref&amp;gt;, в которых представлены параллельные реализации EM алгоритма, описывают помимо использующихся программных и аппаратных решений результаты проведенных экспериментов с данными. В качестве примера в этом разделе будут рассмотрены результаты эксперементов, проведенных со связующим программным обеспечением (&#039;&#039;middleware&#039;&#039;) FREERIDE&amp;lt;ref&amp;gt;Leonid Glimchera, Ruoming Jinb, Gagan Agrawala. Middleware for data mining applications on clusters and grids [http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf]&amp;lt;/ref&amp;gt; (FRamework for Rapid Implementation of Datamining Engines), обеспечивающим возможность распараллеливания как для систем с общей памятью (в частности, симметричных мультипроцессорных систем), так и для систем с распределенной памятью.&lt;br /&gt;
&lt;br /&gt;
Эксперименты проводились на кластере машин Pentium 700MHz связанных при помощи Myrinet&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Myrinet&amp;lt;/ref&amp;gt; LANai 7.0 на трех наборах данных: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;а)&#039;&#039;&#039; 3.3 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; 6.2 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; 12.5 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
Объекты представляют собой координаты точек 10-мерного пространства.&lt;br /&gt;
 &lt;br /&gt;
Количество машин в кластере варьировалось от 1 до 8, при этом на каждой машине запускалось до четырех параллельных потоков.&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов представлены на рисунках 7-9&amp;lt;ref name=FREERIDE/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_a.png|thumb|center|350px|Рисунок 7: набор данных a)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_b.png|thumb|center|350px|Рисунок 8: набор данных b)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_c.png|thumb|center|350px|Рисунок 9: набор данных c)]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что используемые в данном исследовании машины, как и коммуникационная среда, сейчас не используются и считаются устаревшими, результат приведенных экспериментов наглядно показывает, что EM алгоритм хорошо параллелится, зависимость ускорения от числа узлов в кластере с небольшим количеством узлов близка к линейной, а также, что скорость работы алгоритма линейно зависит от числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Данный раздел считается незавершенным и может дополняться&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Примеры библиотек, содержащих последовательную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV(C++)] ([https://github.com/opencv/opencv/blob/master/modules/ml/src/em.cpp github])&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab]&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html Scikit learn (Python)]&lt;br /&gt;
# [http://mlpack.org/index.html MLPack(C++)]&lt;br /&gt;
&lt;br /&gt;
Примеры библиотек, содержащих параллельную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Здесь приводятся как конкретные реализации, так и статьи, описывающие подходы к реализациям распараллеливания EM-алгоритма&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# [https://spark.apache.org/ Apache Spark]&lt;br /&gt;
# [http://accord-framework.net/ Accord.NET Framework (C#)]&lt;br /&gt;
# Статья об использовании FREERIDE middleware для распараллеливания EM алгоритма &amp;lt;ref name=FREERIDE/&amp;gt; &lt;br /&gt;
# [http://andrewharp.com/gmmcuda реализация с использованием CUDA]&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MPI еще одна реализация с использованием CUDA]&lt;br /&gt;
# статья об использовании параллельного EM алгоритма в задачах компьютерного зрения &amp;lt;ref name=CV/&amp;gt;&lt;br /&gt;
# статья о распараллеливании EM алгоритма с использованием CUDA &amp;lt;ref name=CUDA/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Noite</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:Noite/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=6768</id>
		<title>Участник:Noite/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:Noite/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=6768"/>
		<updated>2016-10-13T19:02:06Z</updated>

		<summary type="html">&lt;p&gt;Noite: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n * m^2 * k)&amp;lt;/math&amp;gt; - одна итерация&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n * m + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Noite|Зинченко Д.А.]]&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации, основанный на максимизации ожидания (EM-алгоритм)&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
В задачах оптимизации EM-алгоритмом называют итеративную процедуру поиска численного значения экстремума какой-либо функции. В частности, в статистике этот алгоритм используется для оценки максимального правдоподобия. Впервые название EM-алгоритм было предложено в 1977 году&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;, однако его идеи были описаны и раньше&amp;lt;ref name=korolev&amp;gt;В.Ю.Королёв. ЕМ-алгоритм, его модификации и их применение к задаче разделения смесей вероятностных распределений.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм применяется для решения задач двух типов &amp;lt;ref name=korolev/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Анализ неполных данных (данных с пропусками). &lt;br /&gt;
# Оценка максимального правдоподобия в случае, если функцию правдоподобия трудно исследовать аналитически. В этом случае введение набора скрытых переменных может существенно упростить задачу.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к задачам второго типа. В данной статье рассматривается следующая постановка задачи кластеризации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;Дано множество объектов, каждый из которых представляет собой точку в n-мерном метрическом пространстве. Каждому измерению пространства соответствует некоторое свойство объекта. Необходимо разбить это множество на k подмножеств так, чтобы, чтобы элементы каждого подмножества существенно отличались по свойствам от элементов других подмножеств.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование алгоритма EM подразумевает следующее &#039;&#039;предположение об объектах&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Пусть объекты, которые необходимо разбить на кластеры, появляются случайным образом и независимо друг от друга согласно вероятностному распределению, равному смеси (линейной комбинации) распределений кластеров. В данной статье в дальнейшем будет считаться, что распределение каждого кластера является многомерным нормальным распределением с произвольной матрицей ковариации - наиболее часто используемое предположение.&lt;br /&gt;
&lt;br /&gt;
Тогда каждый объект принадлежит каждому кластеру, но с разной вероятностью. EM-алгоритм итеративно оценивает параметры распределений кластеров, максимизируя логарифмическую функцию максимального правдоподобия. После окончания работы алгоритма объект будет отнесен к кластеру, вероятность принадлежности которому максимальна. Вводимый набор скрытых переменных для каждого объекта - вероятности того, что объект принадлежит каждому из кластеров.&lt;br /&gt;
&lt;br /&gt;
Итерация алгоритма состоит из двух последовательных шагов.&lt;br /&gt;
&lt;br /&gt;
# (Expectation) Вычисляются новые ожидаемые значения скрытых переменных.&lt;br /&gt;
# (Maximization) Решается задача максимизации правдоподобия: По текущим значениям скрытых переменных обновляются параметры распределений для кластеров: математическое ожидание, дисперсия и вероятность появления объектов из кластера.&lt;br /&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;N&amp;lt;/math&amp;gt; - количество объектов, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - количество параметров объекта&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\gamma_{n,k}&amp;lt;/math&amp;gt; - значения скрытых переменных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N_{k}&amp;lt;/math&amp;gt; - количество элементов отнесенных к соответствующему кластеру&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{1},...,x_n&amp;lt;/math&amp;gt; - объекты&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Параметры распределений:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{1},...,w_{k}&amp;lt;/math&amp;gt; - вероятности появления объектов из кластеров (веса кластеров), &amp;lt;math&amp;gt;\sum_{k=1}^Kw_{k}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{1},...,\mu_{k}&amp;lt;/math&amp;gt; - центры гауссиан кластеров&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma_{1},...,\Sigma_{k}&amp;lt;/math&amp;gt; - матрицы ковариации гауссиан кластеров, каждая матрица имеет размерность &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Смесь распределений:&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; P(x) = \sum_{j=1}^Kw_jp(x|\mu_{j}, \Sigma_{j})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Цель алгоритма - вычислить параметры распределений, максимизирующих логарифм функции правдоподобия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\ln P(x|w,\mu,\Sigma)= \sum_{n=1}^N \ln \{ \sum_{k=1}^K w_{k}p(x_{n}|\mu_{k},\Sigma_{k})\}&amp;lt;/math&amp;gt;.&amp;lt;/center&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
* В начале работы алгоритма задаются параметры начального приближения:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{i} = 1/K, \mu_{i} = random(x_{j}), i=1..K, j=1..N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{j,j}^{k}=\frac{1}{NK}\sum_{i=1}^N(x_{i,j} - \mu_{k,j})^2, k=1..K, j=1..M&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Поскольку от начального приближения может сильно зависеть результат работы алгоритма, вместо инициализации кластеров случайными центрами, равными весами и диагональными матрицами ковариации, как в приведенных формулах, часто применяют другие способы (подробнее - в [[#Особенности реализации последовательного алгоритма | особенностях реализации]])&#039;&#039;&lt;br /&gt;
* Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
** E-шаг: используя текущее значение параметров &amp;lt;math&amp;gt;w_{1},...,w_{k};\mu_{1},...,\mu_{k};\Sigma^{1},...,\Sigma^{k}&amp;lt;/math&amp;gt;, вычисляем значение вектора скрытых переменных &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\gamma_{n,k}=\frac{w_{k}p(x_{n}|\mu_{k},\Sigma^{k})}{\sum_{j=1}^K w_{j}p(x_{n}|\mu_{j},\Sigma^{j})}, &amp;lt;/math&amp;gt; знаменатель дроби - нормировочный коэффициент&amp;lt;/center&amp;gt;&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p(x|\mu,\Sigma)=\frac{1}{{(2\pi)}^{\frac{N}{2}}\sqrt{|\Sigma|}}exp\biggl\{-\frac{1}{2}{(x-\mu)}^T{\Sigma}^{-1}(x-\mu)\biggr\}&amp;lt;/math&amp;gt; - плотность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерного нормального распределения&amp;lt;/center&amp;gt;&lt;br /&gt;
** М-шаг: переоценка параметров по текущим значениям скрытых переменных для &amp;lt;math&amp;gt;k = 1..K&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\mu^{new}_{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k}x_{n}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{new}^{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k} (x_{n}-\mu_{k}^{new})(x_{n}-\mu_{k}^{new})^{T}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{k}^{new}=\frac{N_{k}}{N}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;N_{k}=\sum_{n=1}^N \gamma_{n,k}&amp;lt;/math&amp;gt;.&amp;lt;/center&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;
Вычислительное ядро алгоритма состоит из двух шагов, повторяющихся каждую итерацию:&lt;br /&gt;
*Обновление скрытых переменных на основе текущих параметров распределений&lt;br /&gt;
*Обновление параметров кластеров: весов, центров и матриц ковариации&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании вычислительного ядра алгоритма]], основную часть алгоритма составляют итеративно проводимые макрооперации: Expectation шаг - вычисление новых значений скрытых переменных, Maximization шаг - обновление параметров кластеров. Макроструктура алгоритма представлена на рисунке 1:&lt;br /&gt;
[[file:EM_macro.png|thumb|center|600px|Рисунок 1: Макроструктура EM-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Примерная схема реализации EM алгоритма с предварительной обработкой матриц ковариации:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
// n - количество объектов&lt;br /&gt;
&lt;br /&gt;
// m - количество координат объектов&lt;br /&gt;
&lt;br /&gt;
// k - количество кластеров&lt;br /&gt;
&lt;br /&gt;
Инициализировать веса и центры кластеров;&lt;br /&gt;
Инициализировать матрицы ковариации;&lt;br /&gt;
&lt;br /&gt;
// Основной цикл&lt;br /&gt;
Пока условие остановки не выполнено&lt;br /&gt;
    // E-шаг&lt;br /&gt;
    В цикле для каждого кластера&lt;br /&gt;
        Вычислить определитель матрицы ковариации Sigma;&lt;br /&gt;
        Вычислить обратную матрицу матрице Sigma;&lt;br /&gt;
    В цикле для каждого объекта&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Вычислить и запомнить p(x | mu, Sigma) для текущего объекта и кластера;&lt;br /&gt;
            Просуммировать вычисленные p(x | mu, Sigma);&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Обновить скрытые переменные gamma;&lt;br /&gt;
    // M-шаг&lt;br /&gt;
    Обновить веса w;&lt;br /&gt;
    Обновить центры кластеров mu;&lt;br /&gt;
    Обновить матрицы ковариации Sigma;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления определителя произвольной матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления матрицы, обратной произвольной матрице ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации - &amp;lt;math&amp;gt;O(k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С учетом заранее вычисленных определителей и обратных матриц сложность вычисления &amp;lt;math&amp;gt;p(x | \mu,\Sigma)&amp;lt;/math&amp;gt; составит: &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага E составит &amp;lt;math&amp;gt;O(n * m^2 * k + k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления весов кластеров &amp;lt;math&amp;gt;O(k * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления центров кластеров &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления одной матрицы ковариации &amp;lt;math&amp;gt;O(n * m)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления всех матриц ковариации &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага M алгоритма - &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит &amp;lt;math&amp;gt;O(k * m^2 * n + k * m^3 + k * m * n)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В предположении, что размерность объектов много меньше их количества &amp;lt;math&amp;gt;m &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt; получим сложность итерации &amp;lt;math&amp;gt;O(k * m^2 * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большУю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее - вынесены за основной цикл шага E&amp;lt;ref name=ParallelEMComparissonGraphLab&amp;gt;Henggang Cui, Jinliang Wei, Wei Dai. Parallel Implementation of Expectation-Maximization for Fast Convergence - School of Computer Science, Carnegie Mellon University. [https://users.ece.cmu.edu/~hengganc/archive/report/final.pdf]&amp;lt;/ref&amp;gt;. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм&amp;lt;ref&amp;gt;Вячеслав Орешков. EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, а суммарная сложность шага E и сложность всей итерации составит &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Макроструктура алгоритма представлена на рисунке 1 (см. [[#Макроструктура алгоритма|раздел 1.4]] статьи).&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 представлена схема вычислений E-шага алгоритма для одного объекта: для объекта &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и параметров &amp;lt;math&amp;gt;w_{j}, \mu_{j}, \Sigma_{j}, j=1..k&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются ненормированные значения скрытых переменных &amp;lt;math&amp;gt;g_{j}&amp;lt;/math&amp;gt;, нормировочный коэффициент &#039;&#039;normСoeff&#039;&#039;, и получаются итоговые значения &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step.png|thumb|center|400px|Рисунок 2: E-шаг EM алгоритма для одного объекта]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 представлена схема вычислений E-шага алгоритма для всех объектов: для объекта &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt; и параметров-векторов &amp;lt;math&amp;gt;w, \mu, \Sigma&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются значения скрытых переменных. &amp;lt;math&amp;gt;E_{i}, i=1..n&amp;lt;/math&amp;gt; - маркооперации, E-шаги для соответствующих объектов.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step_all.png|thumb|center|400px|Рисунок 3: E-шаг EM алгоритма для всех объектов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена схема вычислений M-шага алгоритма для одного кластера: для объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и скрытых переменных &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;, соответствующих степени принадлежности этих объектов кластеру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, согласно формулам шага M [[#Математическое описание алгоритма|раздела 1.2]] вычисляется нормировочный коэффициент &amp;lt;math&amp;gt;N_{j}&amp;lt;/math&amp;gt; и параметры этого кластера: вес &amp;lt;math&amp;gt;w_{j}^{new}&amp;lt;/math&amp;gt;, матрица ковариации &amp;lt;math&amp;gt;\Sigma_{j}^{new}&amp;lt;/math&amp;gt; и центр кластера &amp;lt;math&amp;gt;\mu_{j}^{new}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step.png|thumb|center|400px|Рисунок 4: M-шаг EM алгоритма для одного кластера]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена схема вычислений M-шага алгоритма для всех кластеров. &amp;lt;math&amp;gt;M_{j}, j=1..k&amp;lt;/math&amp;gt; соответствует макрооперации - M-шагу для соответствующего кластера и скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step_all.png|thumb|center|400px|Рисунок 5: M-шаг EM алгоритма для всех кластеров]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Из схем вычислений шагов E и M шагов алгоритма, приведенным в [[#Информационный граф|предыдущем разделе]], видно, что если размерность матрицы ковариации небольшая (тогда вычисление определителя и обратной матрицы матрице ковариации не является трудоемкой операцией), обе макрооперации EM алгоритма можно распараллеливать как по кластерам, так и по объектам.&lt;br /&gt;
&lt;br /&gt;
Как правило количество кластеров, на которые нужно разбить объекты, несравнимо меньше количества объектов, поэтому распараллеливание в большинстве существующих реализаций происходит по объектам: обработка объектов по возможности равномерно распределяются по кластерам. Теоретически (если считать передачу данных между процессорами мгновенной) при наличии неограниченного числа процессоров сложность алгоритма составит &amp;lt;math&amp;gt;O(m^2 * k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* Целое неотрицательное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
* Значения координат объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; объектов с &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; координатами каждый.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;n * m&amp;lt;/math&amp;gt; вещественных чисел (если координаты объектов - вещественные числа), &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целое неотрицательное число.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - для каждого объекта указан номер кластера, к которому он отнесен.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; целых неотрицательных чисел. &lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
=== Преимущества и недостатки ===&lt;br /&gt;
EM-алгоритм обладает следующими преимуществами и недостатками:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Преимущества:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Слабо чувствителен к выбросам&lt;br /&gt;
# Прост в реализации&lt;br /&gt;
# Быстро сходится при удачном выборе начальных значений параметров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Неустойчив к выбору начальных значений параметров - от них зависит как скорость сходимости, так и результат работы: алгоритм может сойтись к локальному экстремуму функции правдоподобия, который может быть существенно ниже глобального.&lt;br /&gt;
# Алгоритм не находит оптимальное количество кластеров. Количество кластеров, на которые нужно разбить множество объектов, является параметром алгоритма.&lt;br /&gt;
# При большой размерности пространства объектов выдвинутое предположение о модели их распределения может быть некорректным.&lt;br /&gt;
&lt;br /&gt;
=== Влияние структуры матрицы ковариации на форму кластера ===&lt;br /&gt;
&lt;br /&gt;
[[file:DifferentCovariance.png|thumb|center|800px|Рисунок 6: Влияние структуры матрицы ковариации на форму кластеров для двумерного случая. a) - матрицы ковариации являются диагональными, b) - матрицы ковариации произвольны. &amp;lt;ref&amp;gt;Mathworks: Clustering Using Gaussian Mixture Models [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 6 наглядно показывает, что при диагональной форме матриц ковариации полуоси эллипса (в общем случае - эллипсоида), соответствующего распределению объектов, отнесенных кластеру, параллельны осям координат объектов. В противном случае полуоси могут располагаться произвольным образом.&lt;br /&gt;
&lt;br /&gt;
=== Общие свойства ===&lt;br /&gt;
[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] EM алгоритма равна &amp;lt;math&amp;gt;m * k * it&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - размерность объекта, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров, а &amp;lt;math&amp;gt;it&amp;lt;/math&amp;gt; - количество итераций. &lt;br /&gt;
&lt;br /&gt;
EM-алгоритм является итерационным, и число итераций в общем случае не фиксировано: оно зависит от условий остановки, начальных приближений и расположения объектов. Поэтому этот алгоритм &#039;&#039;недетерминированный&#039;&#039;. По тем же причинам EM-алгоритм является &#039;&#039;неустойчивым&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Многие статьи&amp;lt;ref name=FREERIDE&amp;gt;Leonid Glimcher, Gagan Agrawal. Parallelising EM Algorithm on a Cluster of SMPs [http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CV&amp;gt;López-de-Teruel P. E., García J. M., Acacio; The Parallel EM Algorithm and its Applications in Computer Vision [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=MULTITHREAD&amp;gt;Sharon X. Lee, Kaleb L. Leemaqz, Geoffrey J. McLachlan. A simple multithreaded implementation of the EM algorithm for mixture models [https://arxiv.org/pdf/1606.02054.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CUDA&amp;gt;Araújo, G.F., H.T. Macedo, M.T. Chella, C.A.E. Montesco and M.V.O. Medeiros. PARALLEL IMPLEMENTATION OF EXPECTATION-MAXIMISATION ALGORITHM FOR THE TRAINING OF GAUSSIAN MIXTURE MODELS [https://ri.ufs.br/bitstream/123456789/1764/1/ExpectationMaximisationAlgorithm.pdf]&amp;lt;/ref&amp;gt;, в которых представлены параллельные реализации EM алгоритма, описывают помимо использующихся программных и аппаратных решений результаты проведенных экспериментов с данными. В качестве примера в этом разделе будут рассмотрены результаты эксперементов, проведенных со связующим программным обеспечением (&#039;&#039;middleware&#039;&#039;) FREERIDE&amp;lt;ref&amp;gt;Leonid Glimchera, Ruoming Jinb, Gagan Agrawala. Middleware for data mining applications on clusters and grids [http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf]&amp;lt;/ref&amp;gt; (FRamework for Rapid Implementation of Datamining Engines), обеспечивающим возможность распараллеливания как для систем с общей памятью (в частности, симметричных мультипроцессорных систем), так и для систем с распределенной памятью.&lt;br /&gt;
&lt;br /&gt;
Эксперименты проводились на кластере машин Pentium 700MHz связанных при помощи Myrinet&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Myrinet&amp;lt;/ref&amp;gt; LANai 7.0 на трех наборах данных: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;а)&#039;&#039;&#039; 3.3 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; 6.2 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; 12.5 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
Объекты представляют собой координаты точек 10-мерного пространства.&lt;br /&gt;
 &lt;br /&gt;
Количество машин в кластере варьировалось от 1 до 8, при этом на каждой машине запускалось до четырех параллельных потоков.&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов представлены на рисунках 7-9&amp;lt;ref name=FREERIDE/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_a.png|thumb|center|350px|Рисунок 7: набор данных a)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_b.png|thumb|center|350px|Рисунок 8: набор данных b)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_c.png|thumb|center|350px|Рисунок 9: набор данных c)]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что используемые в данном исследовании машины, как и коммуникационная среда, сейчас не используются и считаются устаревшими, результат приведенных экспериментов наглядно показывает, что EM алгоритм хорошо параллелится, зависимость ускорения от числа узлов в кластере с небольшим количеством узлов близка к линейной, а также, что скорость работы алгоритма линейно зависит от числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Данный раздел считается незавершенным и может дополняться&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Примеры библиотек, содержащих последовательную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV(C++)] ([https://github.com/opencv/opencv/blob/master/modules/ml/src/em.cpp github])&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab]&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html Scikit learn (Python)]&lt;br /&gt;
# [http://mlpack.org/index.html MLPack(C++)]&lt;br /&gt;
&lt;br /&gt;
Примеры библиотек, содержащих параллельную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Здесь приводятся как конкретные реализации, так и статьи, описывающие подходы к реализациям распараллеливания EM-алгоритма&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# [https://spark.apache.org/ Apache Spark]&lt;br /&gt;
# [http://accord-framework.net/ Accord.NET Framework (C#)]&lt;br /&gt;
# Статья об использовании FREERIDE middleware для распараллеливания EM алгоритма &amp;lt;ref name=FREERIDE/&amp;gt; &lt;br /&gt;
# [http://andrewharp.com/gmmcuda реализация с использованием CUDA]&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MPI еще одна реализация с использованием CUDA]&lt;br /&gt;
# статья об использовании параллельного EM алгоритма в задачах компьютерного зрения &amp;lt;ref name=CV/&amp;gt;&lt;br /&gt;
# статья о распараллеливании EM алгоритма с использованием CUDA &amp;lt;ref name=CUDA/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[9] http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf&lt;br /&gt;
&lt;br /&gt;
[10] http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf&lt;br /&gt;
&lt;br /&gt;
[11] http://w01fe.com/berkeley/pubs/08-icml-em.pdf&lt;br /&gt;
&lt;br /&gt;
[12] http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf&lt;br /&gt;
&lt;br /&gt;
[13] https://arxiv.org/pdf/1606.02054.pdf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Noite</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:Noite/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=6764</id>
		<title>Участник:Noite/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:Noite/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=6764"/>
		<updated>2016-10-13T19:00:35Z</updated>

		<summary type="html">&lt;p&gt;Noite: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n * m^2 * k)&amp;lt;/math&amp;gt; - одна итерация&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n * m + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Noite|Зинченко Д.А.]]&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации, основанный на максимизации ожидания (EM-алгоритм)&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
В задачах оптимизации EM-алгоритмом называют итеративную процедуру поиска численного значения экстремума какой-либо функции. В частности, в статистике этот алгоритм используется для оценки максимального правдоподобия. Впервые название EM-алгоритм было предложено в 1977 году&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;, однако его идеи были описаны и раньше&amp;lt;ref name=korolev&amp;gt;В.Ю.Королёв. ЕМ-алгоритм, его модификации и их применение к задаче разделения смесей вероятностных распределений.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм применяется для решения задач двух типов &amp;lt;ref name=korolev/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Анализ неполных данных (данных с пропусками). &lt;br /&gt;
# Оценка максимального правдоподобия в случае, если функцию правдоподобия трудно исследовать аналитически. В этом случае введение набора скрытых переменных может существенно упростить задачу.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к задачам второго типа. В данной статье рассматривается следующая постановка задачи кластеризации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;Дано множество объектов, каждый из которых представляет собой точку в n-мерном метрическом пространстве. Каждому измерению пространства соответствует некоторое свойство объекта. Необходимо разбить это множество на k подмножеств так, чтобы, чтобы элементы каждого подмножества существенно отличались по свойствам от элементов других подмножеств.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование алгоритма EM подразумевает следующее &#039;&#039;предположение об объектах&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Пусть объекты, которые необходимо разбить на кластеры, появляются случайным образом и независимо друг от друга согласно вероятностному распределению, равному смеси (линейной комбинации) распределений кластеров. В данной статье в дальнейшем будет считаться, что распределение каждого кластера является многомерным нормальным распределением с произвольной матрицей ковариации - наиболее часто используемое предположение.&lt;br /&gt;
&lt;br /&gt;
Тогда каждый объект принадлежит каждому кластеру, но с разной вероятностью. EM-алгоритм итеративно оценивает параметры распределений кластеров, максимизируя логарифмическую функцию максимального правдоподобия. После окончания работы алгоритма объект будет отнесен к кластеру, вероятность принадлежности которому максимальна. Вводимый набор скрытых переменных для каждого объекта - вероятности того, что объект принадлежит каждому из кластеров.&lt;br /&gt;
&lt;br /&gt;
Итерация алгоритма состоит из двух последовательных шагов.&lt;br /&gt;
&lt;br /&gt;
# (Expectation) Вычисляются новые ожидаемые значения скрытых переменных.&lt;br /&gt;
# (Maximization) Решается задача максимизации правдоподобия: По текущим значениям скрытых переменных обновляются параметры распределений для кластеров: математическое ожидание, дисперсия и вероятность появления объектов из кластера.&lt;br /&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;N&amp;lt;/math&amp;gt; - количество объектов, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - количество параметров объекта&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\gamma_{n,k}&amp;lt;/math&amp;gt; - значения скрытых переменных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N_{k}&amp;lt;/math&amp;gt; - количество элементов отнесенных к соответствующему кластеру&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{1},...,x_n&amp;lt;/math&amp;gt; - объекты&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Параметры распределений:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{1},...,w_{k}&amp;lt;/math&amp;gt; - вероятности появления объектов из кластеров (веса кластеров), &amp;lt;math&amp;gt;\sum_{k=1}^Kw_{k}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{1},...,\mu_{k}&amp;lt;/math&amp;gt; - центры гауссиан кластеров&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma_{1},...,\Sigma_{k}&amp;lt;/math&amp;gt; - матрицы ковариации гауссиан кластеров, каждая матрица имеет размерность &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Смесь распределений:&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; P(x) = \sum_{j=1}^Kw_jp(x|\mu_{j}, \Sigma_{j})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Цель алгоритма - вычислить параметры распределений, максимизирующих логарифм функции правдоподобия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\ln P(x|w,\mu,\Sigma)= \sum_{n=1}^N \ln \{ \sum_{k=1}^K w_{k}p(x_{n}|\mu_{k},\Sigma_{k})\}&amp;lt;/math&amp;gt;.&amp;lt;/center&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
* В начале работы алгоритма задаются параметры начального приближения:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{i} = 1/K, \mu_{i} = random(x_{j}), i=1..K, j=1..N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{j,j}^{k}=\frac{1}{NK}\sum_{i=1}^N(x_{i,j} - \mu_{k,j})^2, k=1..K, j=1..M&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Поскольку от начального приближения может сильно зависеть результат работы алгоритма, вместо инициализации кластеров случайными центрами, равными весами и диагональными матрицами ковариации, как в приведенных формулах, часто применяют другие способы (подробнее - в [[#Особенности реализации последовательного алгоритма | особенностях реализации]])&#039;&#039;&lt;br /&gt;
* Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
** E-шаг: используя текущее значение параметров &amp;lt;math&amp;gt;w_{1},...,w_{k};\mu_{1},...,\mu_{k};\Sigma^{1},...,\Sigma^{k}&amp;lt;/math&amp;gt;, вычисляем значение вектора скрытых переменных &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\gamma_{n,k}=\frac{w_{k}p(x_{n}|\mu_{k},\Sigma^{k})}{\sum_{j=1}^K w_{j}p(x_{n}|\mu_{j},\Sigma^{j})}, &amp;lt;/math&amp;gt; знаменатель дроби - нормировочный коэффициент&amp;lt;/center&amp;gt;&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p(x|\mu,\Sigma)=\frac{1}{{(2\pi)}^{\frac{N}{2}}\sqrt{|\Sigma|}}exp\biggl\{-\frac{1}{2}{(x-\mu)}^T{\Sigma}^{-1}(x-\mu)\biggr\}&amp;lt;/math&amp;gt; - плотность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерного нормального распределения&amp;lt;/center&amp;gt;&lt;br /&gt;
** М-шаг: переоценка параметров по текущим значениям скрытых переменных для &amp;lt;math&amp;gt;k = 1..K&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\mu^{new}_{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k}x_{n}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{new}^{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k} (x_{n}-\mu_{k}^{new})(x_{n}-\mu_{k}^{new})^{T}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{k}^{new}=\frac{N_{k}}{N}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;N_{k}=\sum_{n=1}^N \gamma_{n,k}&amp;lt;/math&amp;gt;.&amp;lt;/center&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;
Вычислительное ядро алгоритма состоит из двух шагов, повторяющихся каждую итерацию:&lt;br /&gt;
*Обновление скрытых переменных на основе текущих параметров распределений&lt;br /&gt;
*Обновление параметров кластеров: весов, центров и матриц ковариации&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании вычислительного ядра алгоритма]], основную часть алгоритма составляют итеративно проводимые макрооперации: Expectation шаг - вычисление новых значений скрытых переменных, Maximization шаг - обновление параметров кластеров. Макроструктура алгоритма представлена на рисунке 1:&lt;br /&gt;
[[file:EM_macro.png|thumb|center|600px|Рисунок 1: Макроструктура EM-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Примерная схема реализации EM алгоритма с предварительной обработкой матриц ковариации:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
// n - количество объектов&lt;br /&gt;
&lt;br /&gt;
// m - количество координат объектов&lt;br /&gt;
&lt;br /&gt;
// k - количество кластеров&lt;br /&gt;
&lt;br /&gt;
Инициализировать веса и центры кластеров;&lt;br /&gt;
Инициализировать матрицы ковариации;&lt;br /&gt;
&lt;br /&gt;
// Основной цикл&lt;br /&gt;
Пока условие остановки не выполнено&lt;br /&gt;
    // E-шаг&lt;br /&gt;
    В цикле для каждого кластера&lt;br /&gt;
        Вычислить определитель матрицы ковариации Sigma;&lt;br /&gt;
        Вычислить обратную матрицу матрице Sigma;&lt;br /&gt;
    В цикле для каждого объекта&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Вычислить и запомнить p(x | mu, Sigma) для текущего объекта и кластера;&lt;br /&gt;
            Просуммировать вычисленные p(x | mu, Sigma);&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Обновить скрытые переменные gamma;&lt;br /&gt;
    // M-шаг&lt;br /&gt;
    Обновить веса w;&lt;br /&gt;
    Обновить центры кластеров mu;&lt;br /&gt;
    Обновить матрицы ковариации Sigma;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления определителя произвольной матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления матрицы, обратной произвольной матрице ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации - &amp;lt;math&amp;gt;O(k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С учетом заранее вычисленных определителей и обратных матриц сложность вычисления &amp;lt;math&amp;gt;p(x | \mu,\Sigma)&amp;lt;/math&amp;gt; составит: &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага E составит &amp;lt;math&amp;gt;O(n * m^2 * k + k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления весов кластеров &amp;lt;math&amp;gt;O(k * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления центров кластеров &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления одной матрицы ковариации &amp;lt;math&amp;gt;O(n * m)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления всех матриц ковариации &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага M алгоритма - &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит &amp;lt;math&amp;gt;O(k * m^2 * n + k * m^3 + k * m * n)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В предположении, что размерность объектов много меньше их количества &amp;lt;math&amp;gt;m &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt; получим сложность итерации &amp;lt;math&amp;gt;O(k * m^2 * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большУю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее - вынесены за основной цикл шага E&amp;lt;ref name=ParallelEMComparissonGraphLab&amp;gt;Henggang Cui, Jinliang Wei, Wei Dai. Parallel Implementation of Expectation-Maximization for Fast Convergence - School of Computer Science, Carnegie Mellon University. [https://users.ece.cmu.edu/~hengganc/archive/report/final.pdf]&amp;lt;/ref&amp;gt;. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм&amp;lt;ref&amp;gt;Вячеслав Орешков. EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, а суммарная сложность шага E и сложность всей итерации составит &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Макроструктура алгоритма представлена на рисунке 1 (см. [[#Макроструктура алгоритма|раздел 1.4]] статьи).&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 представлена схема вычислений E-шага алгоритма для одного объекта: для объекта &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и параметров &amp;lt;math&amp;gt;w_{j}, \mu_{j}, \Sigma_{j}, j=1..k&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются ненормированные значения скрытых переменных &amp;lt;math&amp;gt;g_{j}&amp;lt;/math&amp;gt;, нормировочный коэффициент &#039;&#039;normСoeff&#039;&#039;, и получаются итоговые значения &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step.png|thumb|center|400px|Рисунок 2: E-шаг EM алгоритма для одного объекта]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 представлена схема вычислений E-шага алгоритма для всех объектов: для объекта &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt; и параметров-векторов &amp;lt;math&amp;gt;w, \mu, \Sigma&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются значения скрытых переменных. &amp;lt;math&amp;gt;E_{i}, i=1..n&amp;lt;/math&amp;gt; - маркооперации, E-шаги для соответствующих объектов.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step_all.png|thumb|center|400px|Рисунок 3: E-шаг EM алгоритма для всех объектов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена схема вычислений M-шага алгоритма для одного кластера: для объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и скрытых переменных &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;, соответствующих степени принадлежности этих объектов кластеру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, согласно формулам шага M [[#Математическое описание алгоритма|раздела 1.2]] вычисляется нормировочный коэффициент &amp;lt;math&amp;gt;N_{j}&amp;lt;/math&amp;gt; и параметры этого кластера: вес &amp;lt;math&amp;gt;w_{j}^{new}&amp;lt;/math&amp;gt;, матрица ковариации &amp;lt;math&amp;gt;\Sigma_{j}^{new}&amp;lt;/math&amp;gt; и центр кластера &amp;lt;math&amp;gt;\mu_{j}^{new}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step.png|thumb|center|400px|Рисунок 4: M-шаг EM алгоритма для одного кластера]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена схема вычислений M-шага алгоритма для всех кластеров. &amp;lt;math&amp;gt;M_{j}, j=1..k&amp;lt;/math&amp;gt; соответствует макрооперации - M-шагу для соответствующего кластера и скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step_all.png|thumb|center|400px|Рисунок 5: M-шаг EM алгоритма для всех кластеров]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Из схем вычислений шагов E и M шагов алгоритма, приведенным в [[#Информационный граф|предыдущем разделе]], видно, что если размерность матрицы ковариации небольшая (тогда вычисление определителя и обратной матрицы матрице ковариации не является трудоемкой операцией), обе макрооперации EM алгоритма можно распараллеливать как по кластерам, так и по объектам.&lt;br /&gt;
&lt;br /&gt;
Как правило количество кластеров, на которые нужно разбить объекты, несравнимо меньше количества объектов, поэтому распараллеливание в большинстве существующих реализаций происходит по объектам: обработка объектов по возможности равномерно распределяются по кластерам. Теоретически (если считать передачу данных между процессорами мгновенной) при наличии неограниченного числа процессоров сложность алгоритма составит &amp;lt;math&amp;gt;O(m^2 * k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* Целое неотрицательное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
* Значения координат объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; объектов с &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; координатами каждый.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;n * m&amp;lt;/math&amp;gt; вещественных чисел (если координаты объектов - вещественные числа), &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целое неотрицательное число.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - для каждого объекта указан номер кластера, к которому он отнесен.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; целых неотрицательных чисел. &lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
=== Преимущества и недостатки ===&lt;br /&gt;
EM-алгоритм обладает следующими преимуществами и недостатками:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Преимущества:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Слабо чувствителен к выбросам&lt;br /&gt;
# Прост в реализации&lt;br /&gt;
# Быстро сходится при удачном выборе начальных значений параметров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Неустойчив к выбору начальных значений параметров - от них зависит как скорость сходимости, так и результат работы: алгоритм может сойтись к локальному экстремуму функции правдоподобия, который может быть существенно ниже глобального.&lt;br /&gt;
# Алгоритм не находит оптимальное количество кластеров. Количество кластеров, на которые нужно разбить множество объектов, является параметром алгоритма.&lt;br /&gt;
# При большой размерности пространства объектов выдвинутое предположение о модели их распределения может быть некорректным.&lt;br /&gt;
&lt;br /&gt;
=== Влияние структуры матрицы ковариации на форму кластера ===&lt;br /&gt;
&lt;br /&gt;
[[file:DifferentCovariance.png|thumb|center|800px|Рисунок 6: Влияние структуры матрицы ковариации на форму кластеров для двумерного случая. a) - матрицы ковариации являются диагональными, b) - матрицы ковариации произвольны. &amp;lt;ref&amp;gt;Mathworks: Clustering Using Gaussian Mixture Models [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 6 наглядно показывает, что при диагональной форме матриц ковариации полуоси эллипса (в общем случае - эллипсоида), соответствующего распределению объектов, отнесенных кластеру, параллельны осям координат объектов. В противном случае полуоси могут располагаться произвольным образом.&lt;br /&gt;
&lt;br /&gt;
=== Общие свойства ===&lt;br /&gt;
[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] EM алгоритма равна &amp;lt;math&amp;gt;m * k * it&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - размерность объекта, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров, а &amp;lt;math&amp;gt;it&amp;lt;/math&amp;gt; - количество итераций. &lt;br /&gt;
&lt;br /&gt;
EM-алгоритм является итерационным, и число итераций в общем случае не фиксировано: оно зависит от условий остановки, начальных приближений и расположения объектов. Поэтому этот алгоритм &#039;&#039;недетерминированный&#039;&#039;. По тем же причинам EM-алгоритм является &#039;&#039;неустойчивым&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Многие статьи&amp;lt;ref name=FREERIDE&amp;gt;Leonid Glimcher, Gagan Agrawal. Parallelising EM Algorithm on a Cluster of SMPs [http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CV&amp;gt;López-de-Teruel P. E., García J. M., Acacio; The Parallel EM Algorithm and its Applications in Computer Vision [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=MULTITHREAD&amp;gt;Sharon X. Lee, Kaleb L. Leemaqz, Geoffrey J. McLachlan. A simple multithreaded implementation of the EM algorithm for mixture models [https://arxiv.org/pdf/1606.02054.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CUDA&amp;gt;Araújo, G.F., H.T. Macedo, M.T. Chella, C.A.E. Montesco and M.V.O. Medeiros. PARALLEL IMPLEMENTATION OF EXPECTATION-MAXIMISATION ALGORITHM FOR THE TRAINING OF GAUSSIAN MIXTURE MODELS [https://ri.ufs.br/bitstream/123456789/1764/1/ExpectationMaximisationAlgorithm.pdf]&amp;lt;/ref&amp;gt;, в которых представлены параллельные реализации EM алгоритма, описывают помимо использующихся программных и аппаратных решений результаты проведенных экспериментов с данными. В качестве примера в этом разделе будут рассмотрены результаты эксперементов, проведенных со связующим программным обеспечением (&#039;&#039;middleware&#039;&#039;) FREERIDE&amp;lt;ref&amp;gt;Leonid Glimchera, Ruoming Jinb, Gagan Agrawala. Middleware for data mining applications on clusters and grids &amp;lt;/ref&amp;gt; (FRamework for Rapid Implementation of Datamining Engines), обеспечивающим возможность распараллеливания как для систем с общей памятью (в частности, симметричных мультипроцессорных систем), так и для систем с распределенной памятью.&lt;br /&gt;
&lt;br /&gt;
Эксперименты проводились на кластере машин Pentium 700MHz связанных при помощи Myrinet&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Myrinet&amp;lt;/ref&amp;gt; LANai 7.0 на трех наборах данных: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;а)&#039;&#039;&#039; 3.3 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; 6.2 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; 12.5 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
Объекты представляют собой координаты точек 10-мерного пространства.&lt;br /&gt;
 &lt;br /&gt;
Количество машин в кластере варьировалось от 1 до 8, при этом на каждой машине запускалось до четырех параллельных потоков.&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов представлены на рисунках 7-9&amp;lt;ref name=FREERIDE/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_a.png|thumb|center|350px|Рисунок 7: набор данных a)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_b.png|thumb|center|350px|Рисунок 8: набор данных b)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_c.png|thumb|center|350px|Рисунок 9: набор данных c)]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что используемые в данном исследовании машины, как и коммуникационная среда, сейчас не используются и считаются устаревшими, результат приведенных экспериментов наглядно показывает, что EM алгоритм хорошо параллелится, зависимость ускорения от числа узлов в кластере с небольшим количеством узлов близка к линейной, а также, что скорость работы алгоритма линейно зависит от числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Данный раздел считается незавершенным и может дополняться&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Примеры библиотек, содержащих последовательную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV(C++)] ([https://github.com/opencv/opencv/blob/master/modules/ml/src/em.cpp github])&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab]&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html Scikit learn (Python)]&lt;br /&gt;
# [http://mlpack.org/index.html MLPack(C++)]&lt;br /&gt;
&lt;br /&gt;
Примеры библиотек, содержащих параллельную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Здесь приводятся как конкретные реализации, так и статьи, описывающие подходы к реализациям распараллеливания EM-алгоритма&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# [https://spark.apache.org/ Apache Spark]&lt;br /&gt;
# [http://accord-framework.net/ Accord.NET Framework (C#)]&lt;br /&gt;
# Статья об использовании FREERIDE middleware для распараллеливания EM алгоритма &amp;lt;ref name=FREERIDE/&amp;gt; &lt;br /&gt;
# [http://andrewharp.com/gmmcuda реализация с использованием CUDA]&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MPI еще одна реализация с использованием CUDA]&lt;br /&gt;
# статья об использовании параллельного EM алгоритма в задачах компьютерного зрения &amp;lt;ref name=CV/&amp;gt;&lt;br /&gt;
# статья о распараллеливании EM алгоритма с использованием CUDA &amp;lt;ref name=CUDA/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[9] http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf&lt;br /&gt;
&lt;br /&gt;
[10] http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf&lt;br /&gt;
&lt;br /&gt;
[11] http://w01fe.com/berkeley/pubs/08-icml-em.pdf&lt;br /&gt;
&lt;br /&gt;
[12] http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf&lt;br /&gt;
&lt;br /&gt;
[13] https://arxiv.org/pdf/1606.02054.pdf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Noite</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:Noite/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=6762</id>
		<title>Участник:Noite/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:Noite/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=6762"/>
		<updated>2016-10-13T19:00:22Z</updated>

		<summary type="html">&lt;p&gt;Noite: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n * m^2 * k)&amp;lt;/math&amp;gt; - одна итерация&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n * m + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Noite|Зинченко Д.А.]]&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации, основанный на максимизации ожидания (EM-алгоритм)&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
В задачах оптимизации EM-алгоритмом называют итеративную процедуру поиска численного значения экстремума какой-либо функции. В частности, в статистике этот алгоритм используется для оценки максимального правдоподобия. Впервые название EM-алгоритм было предложено в 1977 году&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;, однако его идеи были описаны и раньше&amp;lt;ref name=korolev&amp;gt;В.Ю.Королёв. ЕМ-алгоритм, его модификации и их применение к задаче разделения смесей вероятностных распределений.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм применяется для решения задач двух типов &amp;lt;ref name=korolev/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Анализ неполных данных (данных с пропусками). &lt;br /&gt;
# Оценка максимального правдоподобия в случае, если функцию правдоподобия трудно исследовать аналитически. В этом случае введение набора скрытых переменных может существенно упростить задачу.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к задачам второго типа. В данной статье рассматривается следующая постановка задачи кластеризации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;Дано множество объектов, каждый из которых представляет собой точку в n-мерном метрическом пространстве. Каждому измерению пространства соответствует некоторое свойство объекта. Необходимо разбить это множество на k подмножеств так, чтобы, чтобы элементы каждого подмножества существенно отличались по свойствам от элементов других подмножеств.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование алгоритма EM подразумевает следующее &#039;&#039;предположение об объектах&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Пусть объекты, которые необходимо разбить на кластеры, появляются случайным образом и независимо друг от друга согласно вероятностному распределению, равному смеси (линейной комбинации) распределений кластеров. В данной статье в дальнейшем будет считаться, что распределение каждого кластера является многомерным нормальным распределением с произвольной матрицей ковариации - наиболее часто используемое предположение.&lt;br /&gt;
&lt;br /&gt;
Тогда каждый объект принадлежит каждому кластеру, но с разной вероятностью. EM-алгоритм итеративно оценивает параметры распределений кластеров, максимизируя логарифмическую функцию максимального правдоподобия. После окончания работы алгоритма объект будет отнесен к кластеру, вероятность принадлежности которому максимальна. Вводимый набор скрытых переменных для каждого объекта - вероятности того, что объект принадлежит каждому из кластеров.&lt;br /&gt;
&lt;br /&gt;
Итерация алгоритма состоит из двух последовательных шагов.&lt;br /&gt;
&lt;br /&gt;
# (Expectation) Вычисляются новые ожидаемые значения скрытых переменных.&lt;br /&gt;
# (Maximization) Решается задача максимизации правдоподобия: По текущим значениям скрытых переменных обновляются параметры распределений для кластеров: математическое ожидание, дисперсия и вероятность появления объектов из кластера.&lt;br /&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;N&amp;lt;/math&amp;gt; - количество объектов, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - количество параметров объекта&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\gamma_{n,k}&amp;lt;/math&amp;gt; - значения скрытых переменных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N_{k}&amp;lt;/math&amp;gt; - количество элементов отнесенных к соответствующему кластеру&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{1},...,x_n&amp;lt;/math&amp;gt; - объекты&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Параметры распределений:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{1},...,w_{k}&amp;lt;/math&amp;gt; - вероятности появления объектов из кластеров (веса кластеров), &amp;lt;math&amp;gt;\sum_{k=1}^Kw_{k}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{1},...,\mu_{k}&amp;lt;/math&amp;gt; - центры гауссиан кластеров&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma_{1},...,\Sigma_{k}&amp;lt;/math&amp;gt; - матрицы ковариации гауссиан кластеров, каждая матрица имеет размерность &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Смесь распределений:&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; P(x) = \sum_{j=1}^Kw_jp(x|\mu_{j}, \Sigma_{j})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Цель алгоритма - вычислить параметры распределений, максимизирующих логарифм функции правдоподобия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\ln P(x|w,\mu,\Sigma)= \sum_{n=1}^N \ln \{ \sum_{k=1}^K w_{k}p(x_{n}|\mu_{k},\Sigma_{k})\}&amp;lt;/math&amp;gt;.&amp;lt;/center&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
* В начале работы алгоритма задаются параметры начального приближения:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{i} = 1/K, \mu_{i} = random(x_{j}), i=1..K, j=1..N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{j,j}^{k}=\frac{1}{NK}\sum_{i=1}^N(x_{i,j} - \mu_{k,j})^2, k=1..K, j=1..M&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Поскольку от начального приближения может сильно зависеть результат работы алгоритма, вместо инициализации кластеров случайными центрами, равными весами и диагональными матрицами ковариации, как в приведенных формулах, часто применяют другие способы (подробнее - в [[#Особенности реализации последовательного алгоритма | особенностях реализации]])&#039;&#039;&lt;br /&gt;
* Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
** E-шаг: используя текущее значение параметров &amp;lt;math&amp;gt;w_{1},...,w_{k};\mu_{1},...,\mu_{k};\Sigma^{1},...,\Sigma^{k}&amp;lt;/math&amp;gt;, вычисляем значение вектора скрытых переменных &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\gamma_{n,k}=\frac{w_{k}p(x_{n}|\mu_{k},\Sigma^{k})}{\sum_{j=1}^K w_{j}p(x_{n}|\mu_{j},\Sigma^{j})}, &amp;lt;/math&amp;gt; знаменатель дроби - нормировочный коэффициент&amp;lt;/center&amp;gt;&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p(x|\mu,\Sigma)=\frac{1}{{(2\pi)}^{\frac{N}{2}}\sqrt{|\Sigma|}}exp\biggl\{-\frac{1}{2}{(x-\mu)}^T{\Sigma}^{-1}(x-\mu)\biggr\}&amp;lt;/math&amp;gt; - плотность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерного нормального распределения&amp;lt;/center&amp;gt;&lt;br /&gt;
** М-шаг: переоценка параметров по текущим значениям скрытых переменных для &amp;lt;math&amp;gt;k = 1..K&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\mu^{new}_{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k}x_{n}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{new}^{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k} (x_{n}-\mu_{k}^{new})(x_{n}-\mu_{k}^{new})^{T}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{k}^{new}=\frac{N_{k}}{N}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;N_{k}=\sum_{n=1}^N \gamma_{n,k}&amp;lt;/math&amp;gt;.&amp;lt;/center&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;
Вычислительное ядро алгоритма состоит из двух шагов, повторяющихся каждую итерацию:&lt;br /&gt;
*Обновление скрытых переменных на основе текущих параметров распределений&lt;br /&gt;
*Обновление параметров кластеров: весов, центров и матриц ковариации&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании вычислительного ядра алгоритма]], основную часть алгоритма составляют итеративно проводимые макрооперации: Expectation шаг - вычисление новых значений скрытых переменных, Maximization шаг - обновление параметров кластеров. Макроструктура алгоритма представлена на рисунке 1:&lt;br /&gt;
[[file:EM_macro.png|thumb|center|600px|Рисунок 1: Макроструктура EM-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Примерная схема реализации EM алгоритма с предварительной обработкой матриц ковариации:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
// n - количество объектов&lt;br /&gt;
&lt;br /&gt;
// m - количество координат объектов&lt;br /&gt;
&lt;br /&gt;
// k - количество кластеров&lt;br /&gt;
&lt;br /&gt;
Инициализировать веса и центры кластеров;&lt;br /&gt;
Инициализировать матрицы ковариации;&lt;br /&gt;
&lt;br /&gt;
// Основной цикл&lt;br /&gt;
Пока условие остановки не выполнено&lt;br /&gt;
    // E-шаг&lt;br /&gt;
    В цикле для каждого кластера&lt;br /&gt;
        Вычислить определитель матрицы ковариации Sigma;&lt;br /&gt;
        Вычислить обратную матрицу матрице Sigma;&lt;br /&gt;
    В цикле для каждого объекта&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Вычислить и запомнить p(x | mu, Sigma) для текущего объекта и кластера;&lt;br /&gt;
            Просуммировать вычисленные p(x | mu, Sigma);&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Обновить скрытые переменные gamma;&lt;br /&gt;
    // M-шаг&lt;br /&gt;
    Обновить веса w;&lt;br /&gt;
    Обновить центры кластеров mu;&lt;br /&gt;
    Обновить матрицы ковариации Sigma;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления определителя произвольной матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления матрицы, обратной произвольной матрице ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации - &amp;lt;math&amp;gt;O(k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С учетом заранее вычисленных определителей и обратных матриц сложность вычисления &amp;lt;math&amp;gt;p(x | \mu,\Sigma)&amp;lt;/math&amp;gt; составит: &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага E составит &amp;lt;math&amp;gt;O(n * m^2 * k + k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления весов кластеров &amp;lt;math&amp;gt;O(k * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления центров кластеров &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления одной матрицы ковариации &amp;lt;math&amp;gt;O(n * m)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления всех матриц ковариации &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага M алгоритма - &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит &amp;lt;math&amp;gt;O(k * m^2 * n + k * m^3 + k * m * n)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В предположении, что размерность объектов много меньше их количества &amp;lt;math&amp;gt;m &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt; получим сложность итерации &amp;lt;math&amp;gt;O(k * m^2 * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большУю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее - вынесены за основной цикл шага E&amp;lt;ref name=ParallelEMComparissonGraphLab&amp;gt;Henggang Cui, Jinliang Wei, Wei Dai. Parallel Implementation of Expectation-Maximization for Fast Convergence - School of Computer Science, Carnegie Mellon University. [https://users.ece.cmu.edu/~hengganc/archive/report/final.pdf]&amp;lt;/ref&amp;gt;. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм&amp;lt;ref&amp;gt;Вячеслав Орешков. EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, а суммарная сложность шага E и сложность всей итерации составит &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Макроструктура алгоритма представлена на рисунке 1 (см. [[#Макроструктура алгоритма|раздел 1.4]] статьи).&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 представлена схема вычислений E-шага алгоритма для одного объекта: для объекта &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и параметров &amp;lt;math&amp;gt;w_{j}, \mu_{j}, \Sigma_{j}, j=1..k&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются ненормированные значения скрытых переменных &amp;lt;math&amp;gt;g_{j}&amp;lt;/math&amp;gt;, нормировочный коэффициент &#039;&#039;normСoeff&#039;&#039;, и получаются итоговые значения &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step.png|thumb|center|400px|Рисунок 2: E-шаг EM алгоритма для одного объекта]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 представлена схема вычислений E-шага алгоритма для всех объектов: для объекта &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt; и параметров-векторов &amp;lt;math&amp;gt;w, \mu, \Sigma&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются значения скрытых переменных. &amp;lt;math&amp;gt;E_{i}, i=1..n&amp;lt;/math&amp;gt; - маркооперации, E-шаги для соответствующих объектов.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step_all.png|thumb|center|400px|Рисунок 3: E-шаг EM алгоритма для всех объектов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена схема вычислений M-шага алгоритма для одного кластера: для объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и скрытых переменных &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;, соответствующих степени принадлежности этих объектов кластеру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, согласно формулам шага M [[#Математическое описание алгоритма|раздела 1.2]] вычисляется нормировочный коэффициент &amp;lt;math&amp;gt;N_{j}&amp;lt;/math&amp;gt; и параметры этого кластера: вес &amp;lt;math&amp;gt;w_{j}^{new}&amp;lt;/math&amp;gt;, матрица ковариации &amp;lt;math&amp;gt;\Sigma_{j}^{new}&amp;lt;/math&amp;gt; и центр кластера &amp;lt;math&amp;gt;\mu_{j}^{new}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step.png|thumb|center|400px|Рисунок 4: M-шаг EM алгоритма для одного кластера]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена схема вычислений M-шага алгоритма для всех кластеров. &amp;lt;math&amp;gt;M_{j}, j=1..k&amp;lt;/math&amp;gt; соответствует макрооперации - M-шагу для соответствующего кластера и скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step_all.png|thumb|center|400px|Рисунок 5: M-шаг EM алгоритма для всех кластеров]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Из схем вычислений шагов E и M шагов алгоритма, приведенным в [[#Информационный граф|предыдущем разделе]], видно, что если размерность матрицы ковариации небольшая (тогда вычисление определителя и обратной матрицы матрице ковариации не является трудоемкой операцией), обе макрооперации EM алгоритма можно распараллеливать как по кластерам, так и по объектам.&lt;br /&gt;
&lt;br /&gt;
Как правило количество кластеров, на которые нужно разбить объекты, несравнимо меньше количества объектов, поэтому распараллеливание в большинстве существующих реализаций происходит по объектам: обработка объектов по возможности равномерно распределяются по кластерам. Теоретически (если считать передачу данных между процессорами мгновенной) при наличии неограниченного числа процессоров сложность алгоритма составит &amp;lt;math&amp;gt;O(m^2 * k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* Целое неотрицательное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
* Значения координат объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; объектов с &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; координатами каждый.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;n * m&amp;lt;/math&amp;gt; вещественных чисел (если координаты объектов - вещественные числа), &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целое неотрицательное число.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - для каждого объекта указан номер кластера, к которому он отнесен.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; целых неотрицательных чисел. &lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
=== Преимущества и недостатки ===&lt;br /&gt;
EM-алгоритм обладает следующими преимуществами и недостатками:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Преимущества:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Слабо чувствителен к выбросам&lt;br /&gt;
# Прост в реализации&lt;br /&gt;
# Быстро сходится при удачном выборе начальных значений параметров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Неустойчив к выбору начальных значений параметров - от них зависит как скорость сходимости, так и результат работы: алгоритм может сойтись к локальному экстремуму функции правдоподобия, который может быть существенно ниже глобального.&lt;br /&gt;
# Алгоритм не находит оптимальное количество кластеров. Количество кластеров, на которые нужно разбить множество объектов, является параметром алгоритма.&lt;br /&gt;
# При большой размерности пространства объектов выдвинутое предположение о модели их распределения может быть некорректным.&lt;br /&gt;
&lt;br /&gt;
=== Влияние структуры матрицы ковариации на форму кластера ===&lt;br /&gt;
&lt;br /&gt;
[[file:DifferentCovariance.png|thumb|center|800px|Рисунок 6: Влияние структуры матрицы ковариации на форму кластеров для двумерного случая. a) - матрицы ковариации являются диагональными, b) - матрицы ковариации произвольны. &amp;lt;ref&amp;gt;Mathworks: Clustering Using Gaussian Mixture Models [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 6 наглядно показывает, что при диагональной форме матриц ковариации полуоси эллипса (в общем случае - эллипсоида), соответствующего распределению объектов, отнесенных кластеру, параллельны осям координат объектов. В противном случае полуоси могут располагаться произвольным образом.&lt;br /&gt;
&lt;br /&gt;
=== Общие свойства ===&lt;br /&gt;
[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] EM алгоритма равна &amp;lt;math&amp;gt;m * k * it&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - размерность объекта, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров, а &amp;lt;math&amp;gt;it&amp;lt;/math&amp;gt; - количество итераций. &lt;br /&gt;
&lt;br /&gt;
EM-алгоритм является итерационным, и число итераций в общем случае не фиксировано: оно зависит от условий остановки, начальных приближений и расположения объектов. Поэтому этот алгоритм &#039;&#039;недетерминированный&#039;&#039;. По тем же причинам EM-алгоритм является &#039;&#039;неустойчивым&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Многие статьи&amp;lt;ref name=FREERIDE&amp;gt;Leonid Glimcher, Gagan Agrawal. Parallelising EM Algorithm on a Cluster of SMPs [http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CV&amp;gt;López-de-Teruel P. E., García J. M., Acacio; The Parallel EM Algorithm and its Applications in Computer Vision [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=MULTITHREAD&amp;gt;Sharon X. Lee, Kaleb L. Leemaqz, Geoffrey J. McLachlan. A simple multithreaded implementation of the EM algorithm for mixture models [https://arxiv.org/pdf/1606.02054.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CUDA&amp;gt;Araújo, G.F., H.T. Macedo, M.T. Chella, C.A.E. Montesco and M.V.O. Medeiros. PARALLEL IMPLEMENTATION OF EXPECTATION-MAXIMISATION ALGORITHM FOR THE TRAINING OF GAUSSIAN MIXTURE MODELS [https://ri.ufs.br/bitstream/123456789/1764/1/ExpectationMaximisationAlgorithm.pdf]&amp;lt;/ref&amp;gt;, в которых представлены параллельные реализации EM алгоритма, описывают помимо использующихся программных и аппаратных решений результаты проведенных экспериментов с данными. В качестве примера в этом разделе будут рассмотрены результаты эксперементов, проведенных со связующим программным обеспечением (&#039;&#039;middleware&#039;&#039;) FREERIDE&amp;lt;ref&amp;gt;Leonid Glimchera, Ruoming Jinb, Gagan Agrawala. Middleware for data mining applications on clusters and grids &amp;lt;/ref&amp;gt; (FRamework for Rapid Implementation of Datamining Engines), обеспечивающим возможность распараллеливания как для систем с общей памятью (в частности, симметричных мультипроцессорных систем), так и для систем с распределенной памятью.&lt;br /&gt;
&lt;br /&gt;
Эксперименты проводились на кластере машин Pentium 700MHz связанных при помощи Myrinet&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Myrinet&amp;lt;/ref&amp;gt; LANai 7.0 на трех наборах данных: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;а)&#039;&#039;&#039; 3.3 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; 6.2 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; 12.5 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
Объекты представляют собой координаты точек 10-мерного пространства.&lt;br /&gt;
 &lt;br /&gt;
Количество машин в кластере варьировалось от 1 до 8, при этом на каждой машине запускалось до четырех параллельных потоков.&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов представлены на рисунках 7-9&amp;lt;ref name=FREERIDE/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_a.png|thumb|center|350px|Рисунок 7: набор данных a)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_b.png|thumb|center|350px|Рисунок 8: набор данных b)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_c.png|thumb|center|350px|Рисунок 9: набор данных c)]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что используемые в данном исследовании машины, как и коммуникационная среда, сейчас не используются и считаются устаревшими, результат приведенных экспериментов наглядно показывает, что EM алгоритм хорошо параллелится, зависимость ускорения от числа узлов в кластере с небольшим количеством узлов близка к линейной, а также, что скорость работы алгоритма линейно зависит от числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Данный раздел считается незавершенным и может дополняться&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Примеры библиотек, содержащих последовательную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV(C++)] ([https://github.com/opencv/opencv/blob/master/modules/ml/src/em.cpp github])&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab]&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html Scikit learn (Python)]&lt;br /&gt;
# [http://mlpack.org/index.html MLPack(C++)]&lt;br /&gt;
&lt;br /&gt;
Примеры библиотек, содержащих параллельную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Здесь приводятся как конкретные реализации, так и статьи, описывающие подходы к реализациям распараллеливания EM-алгоритма&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# [https://spark.apache.org/ Apache Spark]&lt;br /&gt;
# [http://accord-framework.net/ Accord.NET Framework (C#)]&lt;br /&gt;
# Статья об использовании FREERIDE middleware для распараллеливания EM алгоритма &amp;lt;ref name=FREERIDE/&amp;gt; &lt;br /&gt;
# [http://andrewharp.com/gmmcuda реализация с использованием CUDA]&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MPI еще одна реализация с использованием CUDA]&lt;br /&gt;
# статья об использовании параллельного EM алгоритма в задачах компьютерного зрения &amp;lt;ref name=CV/&amp;gt;&lt;br /&gt;
# статья о распараллеливании EM алгоритма с использованием CUDE &amp;lt;ref name=CUDA/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[9] http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf&lt;br /&gt;
&lt;br /&gt;
[10] http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf&lt;br /&gt;
&lt;br /&gt;
[11] http://w01fe.com/berkeley/pubs/08-icml-em.pdf&lt;br /&gt;
&lt;br /&gt;
[12] http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf&lt;br /&gt;
&lt;br /&gt;
[13] https://arxiv.org/pdf/1606.02054.pdf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Noite</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:Noite/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=6761</id>
		<title>Участник:Noite/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:Noite/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=6761"/>
		<updated>2016-10-13T18:56:35Z</updated>

		<summary type="html">&lt;p&gt;Noite: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n * m^2 * k)&amp;lt;/math&amp;gt; - одна итерация&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n * m + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Noite|Зинченко Д.А.]]&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации, основанный на максимизации ожидания (EM-алгоритм)&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
В задачах оптимизации EM-алгоритмом называют итеративную процедуру поиска численного значения экстремума какой-либо функции. В частности, в статистике этот алгоритм используется для оценки максимального правдоподобия. Впервые название EM-алгоритм было предложено в 1977 году&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;, однако его идеи были описаны и раньше&amp;lt;ref name=korolev&amp;gt;В.Ю.Королёв. ЕМ-алгоритм, его модификации и их применение к задаче разделения смесей вероятностных распределений.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм применяется для решения задач двух типов &amp;lt;ref name=korolev/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Анализ неполных данных (данных с пропусками). &lt;br /&gt;
# Оценка максимального правдоподобия в случае, если функцию правдоподобия трудно исследовать аналитически. В этом случае введение набора скрытых переменных может существенно упростить задачу.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к задачам второго типа. В данной статье рассматривается следующая постановка задачи кластеризации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;Дано множество объектов, каждый из которых представляет собой точку в n-мерном метрическом пространстве. Каждому измерению пространства соответствует некоторое свойство объекта. Необходимо разбить это множество на k подмножеств так, чтобы, чтобы элементы каждого подмножества существенно отличались по свойствам от элементов других подмножеств.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование алгоритма EM подразумевает следующее &#039;&#039;предположение об объектах&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Пусть объекты, которые необходимо разбить на кластеры, появляются случайным образом и независимо друг от друга согласно вероятностному распределению, равному смеси (линейной комбинации) распределений кластеров. В данной статье в дальнейшем будет считаться, что распределение каждого кластера является многомерным нормальным распределением с произвольной матрицей ковариации - наиболее часто используемое предположение.&lt;br /&gt;
&lt;br /&gt;
Тогда каждый объект принадлежит каждому кластеру, но с разной вероятностью. EM-алгоритм итеративно оценивает параметры распределений кластеров, максимизируя логарифмическую функцию максимального правдоподобия. После окончания работы алгоритма объект будет отнесен к кластеру, вероятность принадлежности которому максимальна. Вводимый набор скрытых переменных для каждого объекта - вероятности того, что объект принадлежит каждому из кластеров.&lt;br /&gt;
&lt;br /&gt;
Итерация алгоритма состоит из двух последовательных шагов.&lt;br /&gt;
&lt;br /&gt;
# (Expectation) Вычисляются новые ожидаемые значения скрытых переменных.&lt;br /&gt;
# (Maximization) Решается задача максимизации правдоподобия: По текущим значениям скрытых переменных обновляются параметры распределений для кластеров: математическое ожидание, дисперсия и вероятность появления объектов из кластера.&lt;br /&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;N&amp;lt;/math&amp;gt; - количество объектов, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - количество параметров объекта&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\gamma_{n,k}&amp;lt;/math&amp;gt; - значения скрытых переменных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N_{k}&amp;lt;/math&amp;gt; - количество элементов отнесенных к соответствующему кластеру&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{1},...,x_n&amp;lt;/math&amp;gt; - объекты&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Параметры распределений:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{1},...,w_{k}&amp;lt;/math&amp;gt; - вероятности появления объектов из кластеров (веса кластеров), &amp;lt;math&amp;gt;\sum_{k=1}^Kw_{k}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{1},...,\mu_{k}&amp;lt;/math&amp;gt; - центры гауссиан кластеров&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma_{1},...,\Sigma_{k}&amp;lt;/math&amp;gt; - матрицы ковариации гауссиан кластеров, каждая матрица имеет размерность &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Смесь распределений:&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; P(x) = \sum_{j=1}^Kw_jp(x|\mu_{j}, \Sigma_{j})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Цель алгоритма - вычислить параметры распределений, максимизирующих логарифм функции правдоподобия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\ln P(x|w,\mu,\Sigma)= \sum_{n=1}^N \ln \{ \sum_{k=1}^K w_{k}p(x_{n}|\mu_{k},\Sigma_{k})\}&amp;lt;/math&amp;gt;.&amp;lt;/center&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
* В начале работы алгоритма задаются параметры начального приближения:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{i} = 1/K, \mu_{i} = random(x_{j}), i=1..K, j=1..N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{j,j}^{k}=\frac{1}{NK}\sum_{i=1}^N(x_{i,j} - \mu_{k,j})^2, k=1..K, j=1..M&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Поскольку от начального приближения может сильно зависеть результат работы алгоритма, вместо инициализации кластеров случайными центрами, равными весами и диагональными матрицами ковариации, как в приведенных формулах, часто применяют другие способы (подробнее - в [[#Особенности реализации последовательного алгоритма | особенностях реализации]])&#039;&#039;&lt;br /&gt;
* Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
** E-шаг: используя текущее значение параметров &amp;lt;math&amp;gt;w_{1},...,w_{k};\mu_{1},...,\mu_{k};\Sigma^{1},...,\Sigma^{k}&amp;lt;/math&amp;gt;, вычисляем значение вектора скрытых переменных &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\gamma_{n,k}=\frac{w_{k}p(x_{n}|\mu_{k},\Sigma^{k})}{\sum_{j=1}^K w_{j}p(x_{n}|\mu_{j},\Sigma^{j})}, &amp;lt;/math&amp;gt; знаменатель дроби - нормировочный коэффициент&amp;lt;/center&amp;gt;&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p(x|\mu,\Sigma)=\frac{1}{{(2\pi)}^{\frac{N}{2}}\sqrt{|\Sigma|}}exp\biggl\{-\frac{1}{2}{(x-\mu)}^T{\Sigma}^{-1}(x-\mu)\biggr\}&amp;lt;/math&amp;gt; - плотность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерного нормального распределения&amp;lt;/center&amp;gt;&lt;br /&gt;
** М-шаг: переоценка параметров по текущим значениям скрытых переменных для &amp;lt;math&amp;gt;k = 1..K&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\mu^{new}_{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k}x_{n}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{new}^{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k} (x_{n}-\mu_{k}^{new})(x_{n}-\mu_{k}^{new})^{T}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{k}^{new}=\frac{N_{k}}{N}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;N_{k}=\sum_{n=1}^N \gamma_{n,k}&amp;lt;/math&amp;gt;.&amp;lt;/center&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;
Вычислительное ядро алгоритма состоит из двух шагов, повторяющихся каждую итерацию:&lt;br /&gt;
*Обновление скрытых переменных на основе текущих параметров распределений&lt;br /&gt;
*Обновление параметров кластеров: весов, центров и матриц ковариации&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании вычислительного ядра алгоритма]], основную часть алгоритма составляют итеративно проводимые макрооперации: Expectation шаг - вычисление новых значений скрытых переменных, Maximization шаг - обновление параметров кластеров. Макроструктура алгоритма представлена на рисунке 1:&lt;br /&gt;
[[file:EM_macro.png|thumb|center|600px|Рисунок 1: Макроструктура EM-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Примерная схема реализации EM алгоритма с предварительной обработкой матриц ковариации:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
// n - количество объектов&lt;br /&gt;
&lt;br /&gt;
// m - количество координат объектов&lt;br /&gt;
&lt;br /&gt;
// k - количество кластеров&lt;br /&gt;
&lt;br /&gt;
Инициализировать веса и центры кластеров;&lt;br /&gt;
Инициализировать матрицы ковариации;&lt;br /&gt;
&lt;br /&gt;
// Основной цикл&lt;br /&gt;
Пока условие остановки не выполнено&lt;br /&gt;
    // E-шаг&lt;br /&gt;
    В цикле для каждого кластера&lt;br /&gt;
        Вычислить определитель матрицы ковариации Sigma;&lt;br /&gt;
        Вычислить обратную матрицу матрице Sigma;&lt;br /&gt;
    В цикле для каждого объекта&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Вычислить и запомнить p(x | mu, Sigma) для текущего объекта и кластера;&lt;br /&gt;
            Просуммировать вычисленные p(x | mu, Sigma);&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Обновить скрытые переменные gamma;&lt;br /&gt;
    // M-шаг&lt;br /&gt;
    Обновить веса w;&lt;br /&gt;
    Обновить центры кластеров mu;&lt;br /&gt;
    Обновить матрицы ковариации Sigma;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления определителя произвольной матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления матрицы, обратной произвольной матрице ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации - &amp;lt;math&amp;gt;O(k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С учетом заранее вычисленных определителей и обратных матриц сложность вычисления &amp;lt;math&amp;gt;p(x | \mu,\Sigma)&amp;lt;/math&amp;gt; составит: &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага E составит &amp;lt;math&amp;gt;O(n * m^2 * k + k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления весов кластеров &amp;lt;math&amp;gt;O(k * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления центров кластеров &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления одной матрицы ковариации &amp;lt;math&amp;gt;O(n * m)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления всех матриц ковариации &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага M алгоритма - &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит &amp;lt;math&amp;gt;O(k * m^2 * n + k * m^3 + k * m * n)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В предположении, что размерность объектов много меньше их количества &amp;lt;math&amp;gt;m &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt; получим сложность итерации &amp;lt;math&amp;gt;O(k * m^2 * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большУю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее - вынесены за основной цикл шага E&amp;lt;ref name=ParallelEMComparissonGraphLab&amp;gt;Henggang Cui, Jinliang Wei, Wei Dai. Parallel Implementation of Expectation-Maximization for Fast Convergence - School of Computer Science, Carnegie Mellon University. [https://users.ece.cmu.edu/~hengganc/archive/report/final.pdf]&amp;lt;/ref&amp;gt;. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм&amp;lt;ref&amp;gt;Вячеслав Орешков. EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, а суммарная сложность шага E и сложность всей итерации составит &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Макроструктура алгоритма представлена на рисунке 1 (см. [[#Макроструктура алгоритма|раздел 1.4]] статьи).&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 представлена схема вычислений E-шага алгоритма для одного объекта: для объекта &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и параметров &amp;lt;math&amp;gt;w_{j}, \mu_{j}, \Sigma_{j}, j=1..k&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются ненормированные значения скрытых переменных &amp;lt;math&amp;gt;g_{j}&amp;lt;/math&amp;gt;, нормировочный коэффициент &#039;&#039;normСoeff&#039;&#039;, и получаются итоговые значения &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step.png|thumb|center|400px|Рисунок 2: E-шаг EM алгоритма для одного объекта]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 представлена схема вычислений E-шага алгоритма для всех объектов: для объекта &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt; и параметров-векторов &amp;lt;math&amp;gt;w, \mu, \Sigma&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются значения скрытых переменных. &amp;lt;math&amp;gt;E_{i}, i=1..n&amp;lt;/math&amp;gt; - маркооперации, E-шаги для соответствующих объектов.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step_all.png|thumb|center|400px|Рисунок 3: E-шаг EM алгоритма для всех объектов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена схема вычислений M-шага алгоритма для одного кластера: для объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и скрытых переменных &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;, соответствующих степени принадлежности этих объектов кластеру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, согласно формулам шага M [[#Математическое описание алгоритма|раздела 1.2]] вычисляется нормировочный коэффициент &amp;lt;math&amp;gt;N_{j}&amp;lt;/math&amp;gt; и параметры этого кластера: вес &amp;lt;math&amp;gt;w_{j}^{new}&amp;lt;/math&amp;gt;, матрица ковариации &amp;lt;math&amp;gt;\Sigma_{j}^{new}&amp;lt;/math&amp;gt; и центр кластера &amp;lt;math&amp;gt;\mu_{j}^{new}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step.png|thumb|center|400px|Рисунок 4: M-шаг EM алгоритма для одного кластера]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена схема вычислений M-шага алгоритма для всех кластеров. &amp;lt;math&amp;gt;M_{j}, j=1..k&amp;lt;/math&amp;gt; соответствует макрооперации - M-шагу для соответствующего кластера и скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step_all.png|thumb|center|400px|Рисунок 5: M-шаг EM алгоритма для всех кластеров]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Из схем вычислений шагов E и M шагов алгоритма, приведенным в [[#Информационный граф|предыдущем разделе]], видно, что если размерность матрицы ковариации небольшая (тогда вычисление определителя и обратной матрицы матрице ковариации не является трудоемкой операцией), обе макрооперации EM алгоритма можно распараллеливать как по кластерам, так и по объектам.&lt;br /&gt;
&lt;br /&gt;
Как правило количество кластеров, на которые нужно разбить объекты, несравнимо меньше количества объектов, поэтому распараллеливание в большинстве существующих реализаций происходит по объектам: обработка объектов по возможности равномерно распределяются по кластерам. Теоретически (если считать передачу данных между процессорами мгновенной) при наличии неограниченного числа процессоров сложность алгоритма составит &amp;lt;math&amp;gt;O(m^2 * k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* Целое неотрицательное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
* Значения координат объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; объектов с &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; координатами каждый.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;n * m&amp;lt;/math&amp;gt; вещественных чисел (если координаты объектов - вещественные числа), &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целое неотрицательное число.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - для каждого объекта указан номер кластера, к которому он отнесен.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; целых неотрицательных чисел. &lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
=== Преимущества и недостатки ===&lt;br /&gt;
EM-алгоритм обладает следующими преимуществами и недостатками:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Преимущества:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Слабо чувствителен к выбросам&lt;br /&gt;
# Прост в реализации&lt;br /&gt;
# Быстро сходится при удачном выборе начальных значений параметров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Неустойчив к выбору начальных значений параметров - от них зависит как скорость сходимости, так и результат работы: алгоритм может сойтись к локальному экстремуму функции правдоподобия, который может быть существенно ниже глобального.&lt;br /&gt;
# Алгоритм не находит оптимальное количество кластеров. Количество кластеров, на которые нужно разбить множество объектов, является параметром алгоритма.&lt;br /&gt;
# При большой размерности пространства объектов выдвинутое предположение о модели их распределения может быть некорректным.&lt;br /&gt;
&lt;br /&gt;
=== Влияние структуры матрицы ковариации на форму кластера ===&lt;br /&gt;
&lt;br /&gt;
[[file:DifferentCovariance.png|thumb|center|800px|Рисунок 6: Влияние структуры матрицы ковариации на форму кластеров для двумерного случая. a) - матрицы ковариации являются диагональными, b) - матрицы ковариации произвольны. &amp;lt;ref&amp;gt;Mathworks: Clustering Using Gaussian Mixture Models [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 6 наглядно показывает, что при диагональной форме матриц ковариации полуоси эллипса (в общем случае - эллипсоида), соответствующего распределению объектов, отнесенных кластеру, параллельны осям координат объектов. В противном случае полуоси могут располагаться произвольным образом.&lt;br /&gt;
&lt;br /&gt;
=== Общие свойства ===&lt;br /&gt;
[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] EM алгоритма равна &amp;lt;math&amp;gt;m * k * it&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - размерность объекта, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров, а &amp;lt;math&amp;gt;it&amp;lt;/math&amp;gt; - количество итераций. &lt;br /&gt;
&lt;br /&gt;
EM-алгоритм является итерационным, и число итераций в общем случае не фиксировано: оно зависит от условий остановки, начальных приближений и расположения объектов. Поэтому этот алгоритм &#039;&#039;недетерминированный&#039;&#039;. По тем же причинам EM-алгоритм является &#039;&#039;неустойчивым&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Многие статьи&amp;lt;ref name=FREERIDE&amp;gt;Leonid Glimcher, Gagan Agrawal. Parallelising EM Algorithm on a Cluster of SMPs [http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CV&amp;gt;López-de-Teruel P. E., García J. M., Acacio; The Parallel EM Algorithm and its Applications in Computer Vision [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=MULTITHREAD&amp;gt;Sharon X. Lee, Kaleb L. Leemaqz, Geoffrey J. McLachlan. A simple multithreaded implementation of the EM algorithm for mixture models [https://arxiv.org/pdf/1606.02054.pdf]&amp;lt;/ref&amp;gt;&amp;lt;ref name=CUDA&amp;gt;Araújo, G.F., H.T. Macedo, M.T. Chella, C.A.E. Montesco and M.V.O. Medeiros. PARALLEL IMPLEMENTATION OF EXPECTATION-MAXIMISATION ALGORITHM FOR THE TRAINING OF GAUSSIAN MIXTURE MODELS [https://ri.ufs.br/bitstream/123456789/1764/1/ExpectationMaximisationAlgorithm.pdf]&amp;lt;/ref&amp;gt;, в которых представлены параллельные реализации EM алгоритма, описывают помимо использующихся программных и аппаратных решений результаты проведенных экспериментов с данными. В качестве примера в этом разделе будут рассмотрены результаты эксперементов, проведенных со связующим программным обеспечением (&#039;&#039;middleware&#039;&#039;) FREERIDE&amp;lt;ref&amp;gt;Leonid Glimchera, Ruoming Jinb, Gagan Agrawala. Middleware for data mining applications on clusters and grids &amp;lt;/ref&amp;gt; (FRamework for Rapid Implementation of Datamining Engines), обеспечивающим возможность распараллеливания как для систем с общей памятью (в частности, симметричных мультипроцессорных систем), так и для систем с распределенной памятью.&lt;br /&gt;
&lt;br /&gt;
Эксперименты проводились на кластере машин Pentium 700MHz связанных при помощи Myrinet&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Myrinet&amp;lt;/ref&amp;gt; LANai 7.0 на трех наборах данных: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;а)&#039;&#039;&#039; 3.3 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; 6.2 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; 12.5 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
Объекты представляют собой координаты точек 10-мерного пространства.&lt;br /&gt;
 &lt;br /&gt;
Количество машин в кластере варьировалось от 1 до 8, при этом на каждой машине запускалось до четырех параллельных потоков.&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов представлены на рисунках 7-9&amp;lt;ref name=FREERIDE/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_a.png|thumb|center|350px|Рисунок 7: набор данных a)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_b.png|thumb|center|350px|Рисунок 8: набор данных b)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_c.png|thumb|center|350px|Рисунок 9: набор данных c)]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что используемые в данном исследовании машины, как и коммуникационная среда, сейчас не используются и считаются устаревшими, результат приведенных экспериментов наглядно показывает, что EM алгоритм хорошо параллелится, зависимость ускорения от числа узлов в кластере с небольшим количеством узлов близка к линейной, а также, что скорость работы алгоритма линейно зависит от числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Данный раздел считается незавершенным и может дополняться&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Примеры библиотек, содержащих последовательную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV(C++)] ([https://github.com/opencv/opencv/blob/master/modules/ml/src/em.cpp github])&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab]&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html Scikit learn (Python)]&lt;br /&gt;
# [http://mlpack.org/index.html MLPack(C++)]&lt;br /&gt;
&lt;br /&gt;
Примеры библиотек, содержащих параллельную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Здесь приводятся как конкретные реализации, так и статьи, описывающие подходы к реализациям распараллеливания EM-алгоритма&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# [https://spark.apache.org/ Apache Spark]&lt;br /&gt;
# [http://accord-framework.net/ Accord.NET Framework (C#)]&lt;br /&gt;
# статья Parallelizing EM Clustering Algorithm on a Cluster of SMPs&lt;br /&gt;
# [http://andrewharp.com/gmmcuda реализация с использованием CUDA]&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MPI еще одна реализация с использованием CUDA]&lt;br /&gt;
# статья The Parallel EM Algorithm and its Applications in Computer Vision&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[9] http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf&lt;br /&gt;
&lt;br /&gt;
[10] http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf&lt;br /&gt;
&lt;br /&gt;
[11] http://w01fe.com/berkeley/pubs/08-icml-em.pdf&lt;br /&gt;
&lt;br /&gt;
[12] http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf&lt;br /&gt;
&lt;br /&gt;
[13] https://arxiv.org/pdf/1606.02054.pdf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Noite</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:Noite/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=6747</id>
		<title>Участник:Noite/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:Noite/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=6747"/>
		<updated>2016-10-13T18:44:15Z</updated>

		<summary type="html">&lt;p&gt;Noite: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = EM-алгоритм кластеризации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n * m^2 * k)&amp;lt;/math&amp;gt; - одна итерация&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n * m + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Noite|Зинченко Д.А.]]&lt;br /&gt;
&lt;br /&gt;
Алгоритм кластеризации, основанный на максимизации ожидания (EM-алгоритм)&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
В задачах оптимизации EM-алгоритмом называют итеративную процедуру поиска численного значения экстремума какой-либо функции. В частности, в статистике этот алгоритм используется для оценки максимального правдоподобия. Впервые название EM-алгоритм было предложено в 1977 году&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;, однако его идеи были описаны и раньше&amp;lt;ref name=korolev&amp;gt;В.Ю.Королёв. ЕМ-алгоритм, его модификации и их применение к задаче разделения смесей вероятностных распределений.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм применяется для решения задач двух типов &amp;lt;ref name=korolev/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Анализ неполных данных (данных с пропусками). &lt;br /&gt;
# Оценка максимального правдоподобия в случае, если функцию правдоподобия трудно исследовать аналитически. В этом случае введение набора скрытых переменных может существенно упростить задачу.&lt;br /&gt;
&lt;br /&gt;
Задача кластеризации относится к задачам второго типа. В данной статье рассматривается следующая постановка задачи кластеризации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;Дано множество объектов, каждый из которых представляет собой точку в n-мерном метрическом пространстве. Каждому измерению пространства соответствует некоторое свойство объекта. Необходимо разбить это множество на k подмножеств так, чтобы, чтобы элементы каждого подмножества существенно отличались по свойствам от элементов других подмножеств.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование алгоритма EM подразумевает следующее &#039;&#039;предположение об объектах&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Пусть объекты, которые необходимо разбить на кластеры, появляются случайным образом и независимо друг от друга согласно вероятностному распределению, равному смеси (линейной комбинации) распределений кластеров. В данной статье в дальнейшем будет считаться, что распределение каждого кластера является многомерным нормальным распределением с произвольной матрицей ковариации - наиболее часто используемое предположение.&lt;br /&gt;
&lt;br /&gt;
Тогда каждый объект принадлежит каждому кластеру, но с разной вероятностью. EM-алгоритм итеративно оценивает параметры распределений кластеров, максимизируя логарифмическую функцию максимального правдоподобия. После окончания работы алгоритма объект будет отнесен к кластеру, вероятность принадлежности которому максимальна. Вводимый набор скрытых переменных для каждого объекта - вероятности того, что объект принадлежит каждому из кластеров.&lt;br /&gt;
&lt;br /&gt;
Итерация алгоритма состоит из двух последовательных шагов.&lt;br /&gt;
&lt;br /&gt;
# (Expectation) Вычисляются новые ожидаемые значения скрытых переменных.&lt;br /&gt;
# (Maximization) Решается задача максимизации правдоподобия: По текущим значениям скрытых переменных обновляются параметры распределений для кластеров: математическое ожидание, дисперсия и вероятность появления объектов из кластера.&lt;br /&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;N&amp;lt;/math&amp;gt; - количество объектов, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - количество кластеров, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - количество параметров объекта&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\gamma_{n,k}&amp;lt;/math&amp;gt; - значения скрытых переменных&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N_{k}&amp;lt;/math&amp;gt; - количество элементов отнесенных к соответствующему кластеру&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{1},...,x_n&amp;lt;/math&amp;gt; - объекты&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Параметры распределений:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{1},...,w_{k}&amp;lt;/math&amp;gt; - вероятности появления объектов из кластеров (веса кластеров), &amp;lt;math&amp;gt;\sum_{k=1}^Kw_{k}=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{1},...,\mu_{k}&amp;lt;/math&amp;gt; - центры гауссиан кластеров&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma_{1},...,\Sigma_{k}&amp;lt;/math&amp;gt; - матрицы ковариации гауссиан кластеров, каждая матрица имеет размерность &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Смесь распределений:&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; P(x) = \sum_{j=1}^Kw_jp(x|\mu_{j}, \Sigma_{j})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Цель алгоритма - вычислить параметры распределений, максимизирующих логарифм функции правдоподобия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\ln P(x|w,\mu,\Sigma)= \sum_{n=1}^N \ln \{ \sum_{k=1}^K w_{k}p(x_{n}|\mu_{k},\Sigma_{k})\}&amp;lt;/math&amp;gt;.&amp;lt;/center&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
* В начале работы алгоритма задаются параметры начального приближения:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{i} = 1/K, \mu_{i} = random(x_{j}), i=1..K, j=1..N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{j,j}^{k}=\frac{1}{NK}\sum_{i=1}^N(x_{i,j} - \mu_{k,j})^2, k=1..K, j=1..M&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Поскольку от начального приближения может сильно зависеть результат работы алгоритма, вместо инициализации кластеров случайными центрами, равными весами и диагональными матрицами ковариации, как в приведенных формулах, часто применяют другие способы (подробнее - в [[#Особенности реализации последовательного алгоритма | особенностях реализации]])&#039;&#039;&lt;br /&gt;
* Далее итеративно выполняется следующая пара процедур:&lt;br /&gt;
** E-шаг: используя текущее значение параметров &amp;lt;math&amp;gt;w_{1},...,w_{k};\mu_{1},...,\mu_{k};\Sigma^{1},...,\Sigma^{k}&amp;lt;/math&amp;gt;, вычисляем значение вектора скрытых переменных &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\gamma_{n,k}=\frac{w_{k}p(x_{n}|\mu_{k},\Sigma^{k})}{\sum_{j=1}^K w_{j}p(x_{n}|\mu_{j},\Sigma^{j})}, &amp;lt;/math&amp;gt; знаменатель дроби - нормировочный коэффициент&amp;lt;/center&amp;gt;&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p(x|\mu,\Sigma)=\frac{1}{{(2\pi)}^{\frac{N}{2}}\sqrt{|\Sigma|}}exp\biggl\{-\frac{1}{2}{(x-\mu)}^T{\Sigma}^{-1}(x-\mu)\biggr\}&amp;lt;/math&amp;gt; - плотность &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;-мерного нормального распределения&amp;lt;/center&amp;gt;&lt;br /&gt;
** М-шаг: переоценка параметров по текущим значениям скрытых переменных для &amp;lt;math&amp;gt;k = 1..K&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\mu^{new}_{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k}x_{n}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\Sigma_{new}^{k}=\frac{1}{N_{k}}\sum_{n=1}^N \gamma_{n,k} (x_{n}-\mu_{k}^{new})(x_{n}-\mu_{k}^{new})^{T}&amp;lt;/math&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;w_{k}^{new}=\frac{N_{k}}{N}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;N_{k}=\sum_{n=1}^N \gamma_{n,k}&amp;lt;/math&amp;gt;.&amp;lt;/center&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;
Вычислительное ядро алгоритма состоит из двух шагов, повторяющихся каждую итерацию:&lt;br /&gt;
*Обновление скрытых переменных на основе текущих параметров распределений&lt;br /&gt;
*Обновление параметров кластеров: весов, центров и матриц ковариации&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Как записано в [[#Вычислительное ядро алгоритма|описании вычислительного ядра алгоритма]], основную часть алгоритма составляют итеративно проводимые макрооперации: Expectation шаг - вычисление новых значений скрытых переменных, Maximization шаг - обновление параметров кластеров. Макроструктура алгоритма представлена на рисунке 1:&lt;br /&gt;
[[file:EM_macro.png|thumb|center|600px|Рисунок 1: Макроструктура EM-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Примерная схема реализации EM алгоритма с предварительной обработкой матриц ковариации:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
// n - количество объектов&lt;br /&gt;
&lt;br /&gt;
// m - количество координат объектов&lt;br /&gt;
&lt;br /&gt;
// k - количество кластеров&lt;br /&gt;
&lt;br /&gt;
Инициализировать веса и центры кластеров;&lt;br /&gt;
Инициализировать матрицы ковариации;&lt;br /&gt;
&lt;br /&gt;
// Основной цикл&lt;br /&gt;
Пока условие остановки не выполнено&lt;br /&gt;
    // E-шаг&lt;br /&gt;
    В цикле для каждого кластера&lt;br /&gt;
        Вычислить определитель матрицы ковариации Sigma;&lt;br /&gt;
        Вычислить обратную матрицу матрице Sigma;&lt;br /&gt;
    В цикле для каждого объекта&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Вычислить и запомнить p(x | mu, Sigma) для текущего объекта и кластера;&lt;br /&gt;
            Просуммировать вычисленные p(x | mu, Sigma);&lt;br /&gt;
        В цикле для каждого кластера&lt;br /&gt;
            Обновить скрытые переменные gamma;&lt;br /&gt;
    // M-шаг&lt;br /&gt;
    Обновить веса w;&lt;br /&gt;
    Обновить центры кластеров mu;&lt;br /&gt;
    Обновить матрицы ковариации Sigma;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Количество итераций алгоритма зависит от условия остановки, поэтому будем рассматривать сложность одной итерации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления определителя произвольной матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления матрицы, обратной произвольной матрице ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; методом Гаусса - &amp;lt;math&amp;gt;O(m^3)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность предварительного вычисления определителей и обратных матриц матрицам ковариации - &amp;lt;math&amp;gt;O(k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С учетом заранее вычисленных определителей и обратных матриц сложность вычисления &amp;lt;math&amp;gt;p(x | \mu,\Sigma)&amp;lt;/math&amp;gt; составит: &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага E составит &amp;lt;math&amp;gt;O(n * m^2 * k + k * m^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг M&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления весов кластеров &amp;lt;math&amp;gt;O(k * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления центров кластеров &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления одной матрицы ковариации &amp;lt;math&amp;gt;O(n * m)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Сложность обновления всех матриц ковариации &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Суммарно сложность шага M алгоритма - &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, сложность одной итерации EM алгоритма для псевдокода, указанного в предыдущем разделе, составит &amp;lt;math&amp;gt;O(k * m^2 * n + k * m^3 + k * m * n)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В предположении, что размерность объектов много меньше их количества &amp;lt;math&amp;gt;m &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt; получим сложность итерации &amp;lt;math&amp;gt;O(k * m^2 * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно заметить, что вычисление определителя и обратной матрицы к произвольной матрице ковариации составляет большУю часть работы шага E и существенно влияет на его сложность. Поэтому эти вычисления проведены заранее - вынесены за основной цикл шага E&amp;lt;ref name=ParallelEMComparissonGraphLab&amp;gt;Henggang Cui, Jinliang Wei, Wei Dai. Parallel Implementation of Expectation-Maximization for Fast Convergence - School of Computer Science, Carnegie Mellon University. [https://users.ece.cmu.edu/~hengganc/archive/report/final.pdf]&amp;lt;/ref&amp;gt;. Помимо этого сложность этих вычислений можно сократить еще сильнее, если ввести ограничения структуру матрицы ковариации &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее часто используемым ограничением, позволяющим эффективно распараллеливать алгоритм&amp;lt;ref&amp;gt;Вячеслав Орешков. EМ — масштабируемый алгоритм кластеризации [https://basegroup.ru/community/articles/em]&amp;lt;/ref&amp;gt;, является предположение, что матрица ковариации имеет диагональную форму. Тогда вычисление её определителя и обратной матрицы имеет сложнось &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, а суммарная сложность шага E и сложность всей итерации составит &amp;lt;math&amp;gt;O(k * m * n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Макроструктура алгоритма представлена на рисунке 1 (см. [[#Макроструктура алгоритма|раздел 1.4]] статьи).&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 представлена схема вычислений E-шага алгоритма для одного объекта: для объекта &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и параметров &amp;lt;math&amp;gt;w_{j}, \mu_{j}, \Sigma_{j}, j=1..k&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются ненормированные значения скрытых переменных &amp;lt;math&amp;gt;g_{j}&amp;lt;/math&amp;gt;, нормировочный коэффициент &#039;&#039;normСoeff&#039;&#039;, и получаются итоговые значения &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step.png|thumb|center|400px|Рисунок 2: E-шаг EM алгоритма для одного объекта]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 представлена схема вычислений E-шага алгоритма для всех объектов: для объекта &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt; и параметров-векторов &amp;lt;math&amp;gt;w, \mu, \Sigma&amp;lt;/math&amp;gt; по формулам [[#Математическое описание алгоритма|раздела 1.2]] вычисляются значения скрытых переменных. &amp;lt;math&amp;gt;E_{i}, i=1..n&amp;lt;/math&amp;gt; - маркооперации, E-шаги для соответствующих объектов.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Expectation_step_all.png|thumb|center|400px|Рисунок 3: E-шаг EM алгоритма для всех объектов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена схема вычислений M-шага алгоритма для одного кластера: для объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; и скрытых переменных &amp;lt;math&amp;gt;\gamma_{i,j}&amp;lt;/math&amp;gt;, соответствующих степени принадлежности этих объектов кластеру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, согласно формулам шага M [[#Математическое описание алгоритма|раздела 1.2]] вычисляется нормировочный коэффициент &amp;lt;math&amp;gt;N_{j}&amp;lt;/math&amp;gt; и параметры этого кластера: вес &amp;lt;math&amp;gt;w_{j}^{new}&amp;lt;/math&amp;gt;, матрица ковариации &amp;lt;math&amp;gt;\Sigma_{j}^{new}&amp;lt;/math&amp;gt; и центр кластера &amp;lt;math&amp;gt;\mu_{j}^{new}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step.png|thumb|center|400px|Рисунок 4: M-шаг EM алгоритма для одного кластера]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена схема вычислений M-шага алгоритма для всех кластеров. &amp;lt;math&amp;gt;M_{j}, j=1..k&amp;lt;/math&amp;gt; соответствует макрооперации - M-шагу для соответствующего кластера и скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
[[file:EM_Maximization_step_all.png|thumb|center|400px|Рисунок 5: M-шаг EM алгоритма для всех кластеров]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Из схем вычислений шагов E и M шагов алгоритма, приведенным в [[#Информационный граф|предыдущем разделе]], видно, что если размерность матрицы ковариации небольшая (тогда вычисление определителя и обратной матрицы матрице ковариации не является трудоемкой операцией), обе макрооперации EM алгоритма можно распараллеливать как по кластерам, так и по объектам.&lt;br /&gt;
&lt;br /&gt;
Как правило количество кластеров, на которые нужно разбить объекты, несравнимо меньше количества объектов, поэтому распараллеливание в большинстве существующих реализаций происходит по объектам: обработка объектов по возможности равномерно распределяются по кластерам. Теоретически (если считать передачу данных между процессорами мгновенной) при наличии неограниченного числа процессоров сложность алгоритма составит &amp;lt;math&amp;gt;O(m^2 * k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
* Целое неотрицательное число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров;&lt;br /&gt;
* Значения координат объектов &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; объектов с &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; координатами каждый.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;:&lt;br /&gt;
* &amp;lt;math&amp;gt;n * m&amp;lt;/math&amp;gt; вещественных чисел (если координаты объектов - вещественные числа), &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целое неотрицательное число.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;:&lt;br /&gt;
* Вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - для каждого объекта указан номер кластера, к которому он отнесен.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; целых неотрицательных чисел. &lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
=== Преимущества и недостатки ===&lt;br /&gt;
EM-алгоритм обладает следующими преимуществами и недостатками:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Преимущества:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Слабо чувствителен к выбросам&lt;br /&gt;
# Прост в реализации&lt;br /&gt;
# Быстро сходится при удачном выборе начальных значений параметров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Недостатки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Неустойчив к выбору начальных значений параметров - от них зависит как скорость сходимости, так и результат работы: алгоритм может сойтись к локальному экстремуму функции правдоподобия, который может быть существенно ниже глобального.&lt;br /&gt;
# Алгоритм не находит оптимальное количество кластеров. Количество кластеров, на которые нужно разбить множество объектов, является параметром алгоритма.&lt;br /&gt;
# При большой размерности пространства объектов выдвинутое предположение о модели их распределения может быть некорректным.&lt;br /&gt;
&lt;br /&gt;
=== Влияние структуры матрицы ковариации на форму кластера ===&lt;br /&gt;
&lt;br /&gt;
[[file:DifferentCovariance.png|thumb|center|800px|Рисунок 6: Влияние структуры матрицы ковариации на форму кластеров для двумерного случая. a) - матрицы ковариации являются диагональными, b) - матрицы ковариации произвольны. &amp;lt;ref&amp;gt;Mathworks: Clustering Using Gaussian Mixture Models [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html]&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 6 наглядно показывает, что при диагональной форме матриц ковариации полуоси эллипса (в общем случае - эллипсоида), соответствующего распределению объектов, отнесенных кластеру, параллельны осям координат объектов. В противном случае полуоси могут располагаться произвольным образом.&lt;br /&gt;
&lt;br /&gt;
=== Общие свойства ===&lt;br /&gt;
[[глоссарий#Вычислительная мощность|&#039;&#039;Вычислительная мощность&#039;&#039;]] EM алгоритма равна &amp;lt;math&amp;gt;m * k * it&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - размерность объекта, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество кластеров, а &amp;lt;math&amp;gt;it&amp;lt;/math&amp;gt; - количество итераций. &lt;br /&gt;
&lt;br /&gt;
EM-алгоритм является итерационным, и число итераций в общем случае не фиксировано: оно зависит от условий остановки, начальных приближений и расположения объектов. Поэтому этот алгоритм &#039;&#039;недетерминированный&#039;&#039;. По тем же причинам EM-алгоритм является &#039;&#039;неустойчивым&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Многие статьи, в которых представлены параллельные реализации EM алгоритма, описывают помимо использующихся программных и аппаратных решений результаты проведенных экспериментов с данными. В качестве примера в этом разделе будут рассмотрены результаты эксперементов, проведенных со связующим программным обеспечением (&#039;&#039;middleware&#039;&#039;) FREERIDE (FRamework for Rapid Implementation of Datamining Engines), обеспечивающим возможность распараллеливания как для систем с общей памятью (в частности, симметричных мультипроцессорных систем), так и для систем с распределенной памятью.&lt;br /&gt;
&lt;br /&gt;
Эксперименты проводились на кластере машин Pentium 700MHz связанных при помощи Myrinet LANai 7.0 на трех наборах данных: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;а)&#039;&#039;&#039; 3.3 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; 6.2 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; 12.5 * 10^6 объектов&lt;br /&gt;
&lt;br /&gt;
Объекты представляют собой координаты точек 10-мерного пространства.&lt;br /&gt;
 &lt;br /&gt;
Количество машин в кластере варьировалось от 1 до 8, при этом на каждой машине запускалось до четырех параллельных потоков.&lt;br /&gt;
&lt;br /&gt;
Результаты экспериментов представлены на рисунках 7-9 (источник - [9]):&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_a.png|thumb|center|350px|Рисунок 7: набор данных a)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_b.png|thumb|center|350px|Рисунок 8: набор данных b)]]&lt;br /&gt;
 |[[file:EM_FREERIDE_experiments_c.png|thumb|center|350px|Рисунок 9: набор данных c)]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что используемые в данном исследовании машины, как и коммуникационная среда, сейчас не используются и считаются устаревшими, результат приведенных экспериментов наглядно показывает, что EM алгоритм хорошо параллелится, зависимость ускорения от числа узлов в кластере с небольшим количеством узлов близка к линейной, а также, что скорость работы алгоритма линейно зависит от числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Данный раздел считается незавершенным и может дополняться&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Примеры библиотек, содержащих последовательную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
# [http://docs.opencv.org/2.4/modules/ml/doc/expectation_maximization.html OpenCV(C++)] ([https://github.com/opencv/opencv/blob/master/modules/ml/src/em.cpp github])&lt;br /&gt;
# [http://www.mathworks.com/help/stats/clustering-using-gaussian-mixture-models.html Matlab]&lt;br /&gt;
# [http://scikit-learn.org/stable/modules/mixture.html Scikit learn (Python)]&lt;br /&gt;
# [http://mlpack.org/index.html MLPack(C++)]&lt;br /&gt;
&lt;br /&gt;
Примеры библиотек, содержащих параллельную реализацию EM-алгоритма, или отдельных реализаций:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Здесь приводятся как конкретные реализации, так и статьи, описывающие подходы к реализациям распараллеливания EM-алгоритма&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# [https://spark.apache.org/ Apache Spark]&lt;br /&gt;
# [http://accord-framework.net/ Accord.NET Framework (C#)]&lt;br /&gt;
# статья Parallelizing EM Clustering Algorithm on a Cluster of SMPs&lt;br /&gt;
# [http://andrewharp.com/gmmcuda реализация с использованием CUDA]&lt;br /&gt;
# [https://github.com/Corv/CUDA-GMM-MPI еще одна реализация с использованием CUDA]&lt;br /&gt;
# статья The Parallel EM Algorithm and its Applications in Computer Vision&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[9] http://web.cse.ohio-state.edu/~agrawal/allpapers/europar04.pdf&lt;br /&gt;
&lt;br /&gt;
[10] http://www.cs.kent.edu/~jin/Papers/JPDC08.pdf&lt;br /&gt;
&lt;br /&gt;
[11] http://w01fe.com/berkeley/pubs/08-icml-em.pdf&lt;br /&gt;
&lt;br /&gt;
[12] http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.8470&amp;amp;rep=rep1&amp;amp;type=pdf&lt;br /&gt;
&lt;br /&gt;
[13] https://arxiv.org/pdf/1606.02054.pdf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Noite</name></author>
	</entry>
</feed>