<?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=Victoria+Evstefeeva</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=Victoria+Evstefeeva"/>
	<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/Victoria_Evstefeeva"/>
	<updated>2026-10-22T23:56:53Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=25051</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=25051"/>
		<updated>2017-12-07T17:45:27Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Виктория Евстефеева&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&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;L(X, λ, p)=Σ_{i=1}^{n}log(Σ_{j=1}^{3}p_{j}λ_{j}^{X_i}e^{-λ_{j}})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для поиска  более точных параметров, ЕМ алгоритм будет запускаться несколько раз с различными начальными приближениями, выбранными случайным образом. &lt;br /&gt;
&lt;br /&gt;
Затем из множества полученных параметров выбираем те, чья функция правдоподобия наибольшая.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском наилучших параметров с помощью применения ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения N раз применяется ЕМ алгоритм с различными начальными приближениями.&lt;br /&gt;
&lt;br /&gt;
После этого выбираются параметры, у которых функция правдоподобия максимальна.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[File:Em graph.png]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Синяя вершина  - вычисление оптимальных параметров на основе максимазации функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма на разных итерациях происходит независимо от других, после нулевой процесс вычисляет для каждого процесса функцию правдоподобия и находит оптимальные значения параметров, максимизируя функцию правдоподобия, затем нулевой процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Нулевому процессу поручим также принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подается число N - количество наблюдений, затем следует ряд из N  целых чисел, предполагается, что они взяты из пуассон-трехточечного распределения. Также при запуске программы указывается сколько раз должен выполнится ЕМ алгоритм.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси, 6 вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|Intel 13.0.1 + impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Компиляция проводилась с флагом -lm.&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[File:256.png]]&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на загрузку данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8192.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[File:8192.png]]&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Подобных реализаций алгоритма не найдено.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=25050</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=25050"/>
		<updated>2017-12-07T17:44:31Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Виктория Евстефеева&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&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;L(X, λ, p)=Σ_{i=1}^{n}log(Σ_{j=1}^{3}p_{j}λ_{j}^{X_i}e^{-λ_{j}})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для поиска  более точных параметров, ЕМ алгоритм будет запускаться несколько раз с различными начальными приближениями, выбранными случайным образом. &lt;br /&gt;
&lt;br /&gt;
Затем из множества полученных параметров выбираем те, чья функция правдоподобия наибольшая.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском наилучших параметров с помощью применения ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения N раз применяется ЕМ алгоритм с различными начальными приближениями.&lt;br /&gt;
&lt;br /&gt;
После этого выбираются параметры, у которых функция правдоподобия максимальна.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[File:Em graph.png]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Синяя вершина  - вычисление оптимальных параметров на основе максимазации функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма на разных итерациях происходит независимо от других, после нулевой процесс вычисляет для каждого процесса функцию правдоподобия и находит оптимальные значения параметров, максимизируя функцию правдоподобия, затем нулевой процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Нулевому процессу поручим также принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подается число N - количество наблюдений, затем следует ряд из N  целых чисел, предполагается, что они взяты из пуассон-трехточечного распределения. Также при запуске программы указывается сколько раз должен выполнится ЕМ алгоритм.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси, 6 вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|Intel 13.0.1 + impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Компиляция проводилась с флагом -lm.&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[File:256.png]]&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на загрузку данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8192.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[File:8192.png]]&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=25049</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=25049"/>
		<updated>2017-12-07T17:44:07Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Виктория Евстефеева&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&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;L(X, λ, p)=Σ_{i=1}^{n}log(Σ_{j=1}^{3}p_{j}λ_{j}^{X_i}e^{-λ_{j}})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для поиска  более точных параметров, ЕМ алгоритм будет запускаться несколько раз с различными начальными приближениями, выбранными случайным образом. &lt;br /&gt;
&lt;br /&gt;
Затем из множества полученных параметров выбираем те, чья функция правдоподобия наибольшая.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском наилучших параметров с помощью применения ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения N раз применяется ЕМ алгоритм с различными начальными приближениями.&lt;br /&gt;
&lt;br /&gt;
После этого выбираются параметры, у которых функция правдоподобия максимальна.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[File:Em graph.png]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Синяя вершина  - вычисление оптимальных параметров на основе максимазации функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма на разных итерациях происходит независимо от других, после нулевой процесс вычисляет для каждого процесса функцию правдоподобия и находит оптимальные значения параметров, максимизируя функцию правдоподобия, затем нулевой процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Нулевому процессу поручим также принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подается число N - количество наблюдений, затем следует ряд из N  целых чисел, предполагается, что они взяты из пуассон-трехточечного распределения. Также при запуске программы указывается сколько раз должен выполнится ЕМ алгоритм.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси, 6 вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|Intel 13.1.0 + impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Компиляция проводилась с флагом -lm.&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[File:256.png]]&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на загрузку данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8192.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[File:8192.png]]&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=25048</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=25048"/>
		<updated>2017-12-07T17:39:34Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Виктория Евстефеева&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&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;L(X, λ, p)=Σ_{i=1}^{n}log(Σ_{j=1}^{3}p_{j}λ_{j}^{X_i}e^{-λ_{j}})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для поиска  более точных параметров, ЕМ алгоритм будет запускаться несколько раз с различными начальными приближениями, выбранными случайным образом. &lt;br /&gt;
&lt;br /&gt;
Затем из множества полученных параметров выбираем те, чья функция правдоподобия наибольшая.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском наилучших параметров с помощью применения ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения N раз применяется ЕМ алгоритм с различными начальными приближениями.&lt;br /&gt;
&lt;br /&gt;
После этого выбираются параметры, у которых функция правдоподобия максимальна.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[File:Em graph.png]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Синяя вершина  - вычисление оптимальных параметров на основе максимазации функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма на разных итерациях происходит независимо от других, после нулевой процесс вычисляет для каждого процесса функцию правдоподобия и находит оптимальные значения параметров, максимизируя функцию правдоподобия, затем нулевой процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Нулевому процессу поручим также принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подается число N - количество наблюдений, затем следует ряд из N  целых чисел, предполагается, что они взяты из пуассон-трехточечного распределения. Также при запуске программы указывается сколько раз должен выполнится ЕМ алгоритм.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси, 6 вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[File:256.png]]&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на загрузку данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8192.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[File:8192.png]]&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=25047</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=25047"/>
		<updated>2017-12-07T17:38:25Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Виктория Евстефеева&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&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;L(X, λ, p)=Σ_{i=1}^{n}log(Σ_{j=1}^{3}p_{j}λ_{j}^{X_i}e^{-λ_{j}})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для поиска  более точных параметров, ЕМ алгоритм будет запускаться несколько раз с различными начальными приближениями, выбранными случайным образом. &lt;br /&gt;
&lt;br /&gt;
Затем из множества полученных параметров выбираем те, чья функция правдоподобия наибольшая.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском наилучших параметров с помощью применения ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения N раз применяется ЕМ алгоритм с различными начальными приближениями.&lt;br /&gt;
&lt;br /&gt;
После этого выбираются параметры, у которых функция правдоподобия максимальна.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[File:Em graph.png]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Синяя вершина  - вычисление оптимальных параметров на основе максимазации функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма на разных итерациях происходит независимо от других, после нулевой процесс вычисляет для каждого процесса функцию правдоподобия и находит оптимальные значения параметров, максимизируя функцию правдоподобия, затем нулевой процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Нулевому процессу поручим также принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подается число N - количество наблюдений, затем следует ряд из N  целых чисел, предполагается, что они взяты из пуассон-трехточечного распределения. Также при запуске программы указывается сколько раз должен выполнится ЕМ алгоритм.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси, 6 вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[File:256.png]]&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на загрузку данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8192.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Файл:8192.png]]&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=25046</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=25046"/>
		<updated>2017-12-07T17:34:52Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Виктория Евстефеева&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&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;L(X, λ, p)=Σ_{i=1}^{n}log(Σ_{j=1}^{3}p_{j}λ_{j}^{X_i}e^{-λ_{j}})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для поиска  более точных параметров, ЕМ алгоритм будет запускаться несколько раз с различными начальными приближениями, выбранными случайным образом. &lt;br /&gt;
&lt;br /&gt;
Затем из множества полученных параметров выбираем те, чья функция правдоподобия наибольшая.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском наилучших параметров с помощью применения ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения N раз применяется ЕМ алгоритм с различными начальными приближениями.&lt;br /&gt;
&lt;br /&gt;
После этого выбираются параметры, у которых функция правдоподобия максимальна.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[File:Em graph.png]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Синяя вершина  - вычисление оптимальных параметров на основе максимазации функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма на разных итерациях происходит независимо от других, после нулевой процесс вычисляет для каждого процесса функцию правдоподобия и находит оптимальные значения параметров, максимизируя функцию правдоподобия, затем нулевой процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Нулевому процессу поручим также принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подается число N - количество наблюдений, затем следует ряд из N  целых чисел, предполагается, что они взяты из пуассон-трехточечного распределения. Также при запуске программы указывается сколько раз должен выполнится ЕМ алгоритм.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси, 6 вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Файл:256.png]]&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на загрузку данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8192.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Файл:8192.png]]&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=25045</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=25045"/>
		<updated>2017-12-07T17:30:09Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Виктория Евстефеева&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&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;L(X, λ, p)=Σ_{i=1}^{n}log(Σ_{j=1}^{3}p_{j}λ_{j}^{X_i}e^{-λ_{j}})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для поиска  более точных параметров, ЕМ алгоритм будет запускаться несколько раз с различными начальными приближениями, выбранными случайным образом. &lt;br /&gt;
&lt;br /&gt;
Затем из множества полученных параметров выбираем те, чья функция правдоподобия наибольшая.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском наилучших параметров с помощью применения ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения N раз применяется ЕМ алгоритм с различными начальными приближениями.&lt;br /&gt;
&lt;br /&gt;
После этого выбираются параметры, у которых функция правдоподобия максимальна.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[File:Em graph.png]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Синяя вершина  - вычисление оптимальных параметров на основе максимазации функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма на разных итерациях происходит независимо от других, после нулевой процесс вычисляет для каждого процесса функцию правдоподобия и находит оптимальные значения параметров, максимизируя функцию правдоподобия, затем нулевой процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Нулевому процессу поручим также принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подается число N - количество наблюдений, затем следует ряд из N  целых чисел, предполагается, что они взяты из пуассон-трехточечного распределения. Также при запуске программы указывается сколько раз должен выполнится ЕМ алгоритм.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси, 6 вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на загрузку данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8192.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=25044</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=25044"/>
		<updated>2017-12-07T17:29:35Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Виктория Евстефеева&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&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;L(X, λ, p)=Σ_{i=1}^{n}log(Σ_{j=1}^{3}p_{j}λ_{j}^{X_i}e^{-λ_{j}})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для поиска  более точных параметров, ЕМ алгоритм будет запускаться несколько раз с различными начальными приближениями, выбранными случайным образом. &lt;br /&gt;
&lt;br /&gt;
Затем из множества полученных параметров выбираем те, чья функция правдоподобия наибольшая.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском наилучших параметров с помощью применения ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения N раз применяется ЕМ алгоритм с различными начальными приближениями.&lt;br /&gt;
&lt;br /&gt;
После этого выбираются параметры, у которых функция правдоподобия максимальна.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[File:Em graph.png]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Синяя вершина  - вычисление оптимальных параметров на основе максимазации функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма на разных итерациях происходит независимо от других, после нулевой процесс вычисляет для каждого процесса функцию правдоподобия и находит оптимальные значения параметров, максимизируя функцию правдоподобия, затем нулевой процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Нулевому процессу поручим также принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подается число N -количество наблюдений, затем следует ряд из N  целых чисел, предполагается, что они взяты из пуассон-трехточечного распределения. Также при запуске программы указывается сколько раз должен выполнится ЕМ алгоритм.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси, 6 вещественных чисел.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на загрузку данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8192.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=25043</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=25043"/>
		<updated>2017-12-07T17:22:36Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Виктория Евстефеева&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&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;L(X, λ, p)=Σ_{i=1}^{n}log(Σ_{j=1}^{3}p_{j}λ_{j}^{X_i}e^{-λ_{j}})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для поиска  более точных параметров, ЕМ алгоритм будет запускаться несколько раз с различными начальными приближениями, выбранными случайным образом. &lt;br /&gt;
&lt;br /&gt;
Затем из множества полученных параметров выбираем те, чья функция правдоподобия наибольшая.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском наилучших параметров с помощью применения ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения N раз применяется ЕМ алгоритм с различными начальными приближениями.&lt;br /&gt;
&lt;br /&gt;
После этого выбираются параметры, у которых функция правдоподобия максимальна.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[File:Em graph.png]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Синяя вершина  - вычисление оптимальных параметров на основе максимазации функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма на разных итерациях происходит независимо от других, после нулевой процесс вычисляет для каждого процесса функцию правдоподобия и находит оптимальные значения параметров, максимизируя функцию правдоподобия, затем нулевой процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Нулевому процессу поручим также принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на загрузку данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8192.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=25042</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=25042"/>
		<updated>2017-12-07T17:20:30Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Виктория Евстефеева&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&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;L(X, λ, p)=Σ_{i=1}^{n}log(Σ_{j=1}^{3}p_{j}λ_{j}^{X_i}e^{-λ_{j}})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для поиска  более точных параметров, ЕМ алгоритм будет запускаться несколько раз с различными начальными приближениями, выбранными случайным образом. &lt;br /&gt;
&lt;br /&gt;
Затем из множества полученных параметров выбираем те, чья функция правдоподобия наибольшая.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском наилучших параметров с помощью применения ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения N раз применяется ЕМ алгоритм к различным начальным приближениям.&lt;br /&gt;
&lt;br /&gt;
После этого выбираются параметры, у которых функция правдоподобия максимальна.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[File:Em graph.png]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Синяя вершина  - вычисление оптимальных параметров на основе максимазации функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма на разных итерациях происходит независимо от других, после нулевой процесс вычисляет для каждого процесса функцию правдоподобия и находит оптимальные значения параметров, максимизируя функцию правдоподобия, затем нулевой процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Нулевому процессу поручим также принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на загрузку данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8192.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=25041</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=25041"/>
		<updated>2017-12-07T17:18:06Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Виктория Евстефеева&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&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;L(X, λ, p)=Σ_{i=1}^{n}log(Σ_{j=1}^{3}p_{j}λ_{j}^{X_i}e^{-λ_{j}})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для поиска  более точных параметров, ЕМ алгоритм будет запускаться несколько раз с различными начальными приближениями, выбранными случайным образом. &lt;br /&gt;
&lt;br /&gt;
Затем из множества полученных параметров выбираем те, чья функция правдоподобия наибольшая.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском наилучших параметров с помощью применения ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется алгоритм, описанный в разделе 1.3.&lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &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;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[File:Em graph.png]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Синяя вершина  - вычисление оптимальных параметров на основе максимазации функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма на разных итерациях происходит независимо от других, после нулевой процесс вычисляет для каждого процесса функцию правдоподобия и находит оптимальные значения параметров, максимизируя функцию правдоподобия, затем нулевой процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Нулевому процессу поручим также принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на загрузку данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8192.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=25040</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=25040"/>
		<updated>2017-12-07T17:14:58Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Виктория Евстефеева&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&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;L(X, λ, p)=Σ_{i=1}^{n}log(Σ_{j=1}^{3}p_{j}λ_{j}^{X_i}e^{-λ_{j}})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для поиска  более точных параметров, ЕМ алгоритм будет запускаться несколько раз с различными начальными приближениями, выбранными случайным образом. &lt;br /&gt;
&lt;br /&gt;
Затем из множества полученных параметров выбираем те, чья функция правдоподобия наибольшая.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с максимизацией функции правдоподобия для поиска параметров пуассон-трехточечного распределения. Это итерационный алгоритм, процесс поиска происходит до тех пор, пока разность функций правдоподобия на предыдущей итерации и на нынешней не станет меньше некоторого заданного наперед числа.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется алгоритм, описанный в разделе 1.3.&lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &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;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[File:Em graph.png]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Синяя вершина  - вычисление оптимальных параметров на основе максимазации функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма на разных итерациях происходит независимо от других, после нулевой процесс вычисляет для каждого процесса функцию правдоподобия и находит оптимальные значения параметров, максимизируя функцию правдоподобия, затем нулевой процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Нулевому процессу поручим также принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на загрузку данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8192.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=25039</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=25039"/>
		<updated>2017-12-07T17:04:13Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Виктория Евстефеева&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&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;L(X, λ, p)=Σ_{i=1}^{n}log(Σ_{j=1}^{3}p_{j}λ_{j}^{X_i}e^{-λ_{j}})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с максимизацией функции правдоподобия для поиска параметров пуассон-трехточечного распределения. Это итерационный алгоритм, процесс поиска происходит до тех пор, пока разность функций правдоподобия на предыдущей итерации и на нынешней не станет меньше некоторого заданного наперед числа.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется алгоритм, описанный в разделе 1.3.&lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &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;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[File:Em graph.png]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Синяя вершина  - вычисление оптимальных параметров на основе максимазации функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма на разных итерациях происходит независимо от других, после нулевой процесс вычисляет для каждого процесса функцию правдоподобия и находит оптимальные значения параметров, максимизируя функцию правдоподобия, затем нулевой процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Нулевому процессу поручим также принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на загрузку данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8192.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=25038</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=25038"/>
		<updated>2017-12-07T16:58:04Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Виктория Евстефеева&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&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;L(X, λ, p)=Σ_{i=1}^{n}log(Σ_{j=1}^{3}p_{j}λ_{j}^{X_i}e^{-λ_{j}})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с максимизацией функции правдоподобия для поиска параметров пуассон-трехточечного распределения. Это итерационный алгоритм, процесс поиска происходит до тех пор, пока разность функций правдоподобия на предыдущей итерации и на нынешней не станет меньше некоторого заданного наперед числа.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется ЕМ алгоритм для разделения смеси. &lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &lt;br /&gt;
&lt;br /&gt;
После каждой итерации получаем параметры распределения. Считаем функцию правдоподобия. &lt;br /&gt;
&lt;br /&gt;
Если ее значение больше, чем в другой итерации, то эти параметры смеси запоминаются.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[File:Em graph.png]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Синяя вершина  - вычисление оптимальных параметров на основе максимазации функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма на разных итерациях происходит независимо от других, после нулевой процесс вычисляет для каждого процесса функцию правдоподобия и находит оптимальные значения параметров, максимизируя функцию правдоподобия, затем нулевой процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Нулевому процессу поручим также принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на загрузку данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8192.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=25037</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=25037"/>
		<updated>2017-12-07T16:57:31Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Виктория Евстефеева&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&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;L(X, λ, p)=Σ_{i=1}^{n}log(Σ_{j=1}^{3}p_{j}λ_{j}^{X_i}e^{-λ_{j}})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с максимизацией функции правдоподобия для поиска параметров пуассон-трехточечного распределения. Это итерационный алгоритм, процесс поиска происходит до тех пор, пока разность функций правдоподобия на предыдущей итерации и на нынешней не станет меньше некоторого заданного заранее числа.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется ЕМ алгоритм для разделения смеси. &lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &lt;br /&gt;
&lt;br /&gt;
После каждой итерации получаем параметры распределения. Считаем функцию правдоподобия. &lt;br /&gt;
&lt;br /&gt;
Если ее значение больше, чем в другой итерации, то эти параметры смеси запоминаются.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[File:Em graph.png]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Синяя вершина  - вычисление оптимальных параметров на основе максимазации функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма на разных итерациях происходит независимо от других, после нулевой процесс вычисляет для каждого процесса функцию правдоподобия и находит оптимальные значения параметров, максимизируя функцию правдоподобия, затем нулевой процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Нулевому процессу поручим также принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на загрузку данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8192.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=25036</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=25036"/>
		<updated>2017-12-07T16:47:08Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Виктория Евстефеева&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&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;L(X, λ, p)=Σ_{i=1}^{n}log(Σ_{j=1}^{3}p_{j}λ_{j}^{X_i}e^{-λ_{j}})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском параметров пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется ЕМ алгоритм для разделения смеси. &lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &lt;br /&gt;
&lt;br /&gt;
После каждой итерации получаем параметры распределения. Считаем функцию правдоподобия. &lt;br /&gt;
&lt;br /&gt;
Если ее значение больше, чем в другой итерации, то эти параметры смеси запоминаются.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[File:Em graph.png]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Синяя вершина  - вычисление оптимальных параметров на основе максимазации функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма на разных итерациях происходит независимо от других, после нулевой процесс вычисляет для каждого процесса функцию правдоподобия и находит оптимальные значения параметров, максимизируя функцию правдоподобия, затем нулевой процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Нулевому процессу поручим также принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на загрузку данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8192.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=25035</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=25035"/>
		<updated>2017-12-07T16:46:37Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Виктория Евстефеева&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&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;L(X, λ, p)=Σ_{i=1}^{n}log(Σ_{j=1}^{3}p_{j}λ_{j}^{X_i}e^{-λ_{j}})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском параметров пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется ЕМ алгоритм для разделения смеси. &lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &lt;br /&gt;
&lt;br /&gt;
После каждой итерации получаем параметры распределения. Считаем функцию правдоподобия. &lt;br /&gt;
&lt;br /&gt;
Если ее значение больше, чем в другой итерации, то эти параметры смеси запоминаются.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Em graph.png]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Синяя вершина  - вычисление оптимальных параметров на основе максимазации функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма на разных итерациях происходит независимо от других, после нулевой процесс вычисляет для каждого процесса функцию правдоподобия и находит оптимальные значения параметров, максимизируя функцию правдоподобия, затем нулевой процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Нулевому процессу поручим также принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на загрузку данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8192.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24961</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24961"/>
		<updated>2017-12-03T21:13:48Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Виктория Евстефеева&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&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;L(X, λ, p)=Σ_{i=1}^{n}log(Σ_{j=1}^{3}p_{j}λ_{j}^{X_i}e^{-λ_{j}})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском параметров пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется ЕМ алгоритм для разделения смеси. &lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &lt;br /&gt;
&lt;br /&gt;
После каждой итерации получаем параметры распределения. Считаем функцию правдоподобия. &lt;br /&gt;
&lt;br /&gt;
Если ее значение больше, чем в другой итерации, то эти параметры смеси запоминаются.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Em graph.png]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Синяя вершина  - вычисление оптимальных параметров на основе максимазации функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма на разных итерациях происходит независимо от других, после нулевой процесс вычисляет для каждого процесса функцию правдоподобия и находит оптимальные значения параметров, максимизируя функцию правдоподобия, затем нулевой процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Нулевому процессу поручим также принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на загрузку данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8192.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24960</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24960"/>
		<updated>2017-12-03T21:12:06Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Виктория Евстефеева&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&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;L(X, λ, p)=Σ_{i=1}^{n}log(Σ_{j=1}^{3}p_{j}λ_{j}^{X_i}e^{-λ_{j}})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском параметров пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется ЕМ алгоритм для разделения смеси. &lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &lt;br /&gt;
&lt;br /&gt;
После каждой итерации получаем параметры распределения. Считаем функцию правдоподобия. &lt;br /&gt;
&lt;br /&gt;
Если ее значение больше, чем в другой итерации, то эти параметры смеси запоминаются.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Em graph.png]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Синяя вершина  - вычисление оптимальных параметров на основе максимазации функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма на разных итерациях происходит независимо от других, после нулевой процесс вычисляет для каждого процесса функцию правдоподобия и находит оптимальные значения параметров, максимизируя функцию правдоподобия, затем нулевой процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Нулевому процессу поручим принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на загрузку данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8192.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24959</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24959"/>
		<updated>2017-12-03T20:59:55Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Виктория Евстефеева&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&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;L(X, λ, p)=Σ_{i=1}^{n}log(Σ_{j=1}^{3}p_{j}λ_{j}^{X_i}e^{-λ_{j}})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском параметров пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется ЕМ алгоритм для разделения смеси. &lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &lt;br /&gt;
&lt;br /&gt;
После каждой итерации получаем параметры распределения. Считаем функцию правдоподобия. &lt;br /&gt;
&lt;br /&gt;
Если ее значение больше, чем в другой итерации, то эти параметры смеси запоминаются.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Em graph.png]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Желтые вершины - вычисление функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма на разных итерациях происходит независимо от других, после нулевой процесс вычисляет для каждого процесса функцию правдоподобия и находит оптимальные значения параметров, максимизируя функцию правдоподобия, затем нулевой процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Нулевому процессу поручим принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на загрузку данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8192.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24945</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24945"/>
		<updated>2017-12-03T19:24:51Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Виктория Евстефеева&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&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;L(X, λ, p)=Σ_{i=1}^{n}log(Σ_{j=1}^{3}p_{j}λ_{j}^{X_i}e^{-λ_{j}})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском параметров пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется ЕМ алгоритм для разделения смеси. &lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &lt;br /&gt;
&lt;br /&gt;
После каждой итерации получаем параметры распределения. Считаем функцию правдоподобия. &lt;br /&gt;
&lt;br /&gt;
Если ее значение больше, чем в другой итерации, то эти параметры смеси запоминаются.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Em graph.png]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Желтые вершины - вычисление функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма и функции правдоподобия на разных итерациях происходит независимо от других, затем они завершаются и первый процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Первому процессу поручим принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на загрузку данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8192.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24944</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24944"/>
		<updated>2017-12-03T19:08:28Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Виктория Евстефеева&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&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;L(X, λ, p)=Σ_{i=1}^{n}log(Σ_{j=1}^{3}p_{j}λ_{j}^{X_i}e^{-λ_{j}})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском параметров пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется ЕМ алгоритм для разделения смеси. &lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &lt;br /&gt;
&lt;br /&gt;
После каждой итерации получаем параметры распределения. Считаем функцию правдоподобия. &lt;br /&gt;
&lt;br /&gt;
Если ее значение больше, чем в другой итерации, то эти параметры смеси запоминаются.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Em graph.png]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Желтые вершины - вычисление функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма и функции правдоподобия на разных итерациях происходит независимо от других, затем они завершаются и первый процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Первому процессу поручим принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на загрузку данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8196.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24937</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24937"/>
		<updated>2017-12-03T18:43:13Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Динамические характеристики и эффективность реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&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;L(X, λ, p)=Σ_{i=1}^{n}log(Σ_{j=1}^{3}p_{j}λ_{j}^{X_i}e^{-λ_{j}})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском параметров пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется ЕМ алгоритм для разделения смеси. &lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &lt;br /&gt;
&lt;br /&gt;
После каждой итерации получаем параметры распределения. Считаем функцию правдоподобия. &lt;br /&gt;
&lt;br /&gt;
Если ее значение больше, чем в другой итерации, то эти параметры смеси запоминаются.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Em graph.png]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Желтые вершины - вычисление функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма и функции правдоподобия на разных итерациях происходит независимо от других, затем они завершаются и первый процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Первому процессу поручим принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на загрузку данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8196.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24936</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24936"/>
		<updated>2017-12-03T18:42:57Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&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;L(X, λ, p)=Σ_{i=1}^{n}log(Σ_{j=1}^{3}p_{j}λ_{j}^{X_i}e^{-λ_{j}})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском параметров пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется ЕМ алгоритм для разделения смеси. &lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &lt;br /&gt;
&lt;br /&gt;
После каждой итерации получаем параметры распределения. Считаем функцию правдоподобия. &lt;br /&gt;
&lt;br /&gt;
Если ее значение больше, чем в другой итерации, то эти параметры смеси запоминаются.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Em graph.png]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Желтые вершины - вычисление функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма и функции правдоподобия на разных итерациях происходит независимо от других, затем они завершаются и первый процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Первому процессу поручим принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на загрузку данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8196.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на загрузку данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8196.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24933</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24933"/>
		<updated>2017-12-03T18:23:08Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&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;L(X, λ, p)=Σ_{i=1}^{n}log(Σ_{j=1}^{3}p_{j}λ_{j}^{X_i}e^{-λ_{j}})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском параметров пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется ЕМ алгоритм для разделения смеси. &lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &lt;br /&gt;
&lt;br /&gt;
После каждой итерации получаем параметры распределения. Считаем функцию правдоподобия. &lt;br /&gt;
&lt;br /&gt;
Если ее значение больше, чем в другой итерации, то эти параметры смеси запоминаются.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Em graph.png]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Желтые вершины - вычисление функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма и функции правдоподобия на разных итерациях происходит независимо от других, затем они завершаются и первый процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Первому процессу поручим принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на загрузку данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8196.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24932</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24932"/>
		<updated>2017-12-03T18:22:11Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&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;L(X, λ, p)=Σ_{i=1}^{n}log(Σ_{j=1}^{3}p_{j}λ_{j}^{X_i}e^{-λ_{j}})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском параметров пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется ЕМ алгоритм для разделения смеси. &lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &lt;br /&gt;
&lt;br /&gt;
После каждой итерации получаем параметры распределения. Считаем функцию правдоподобия. &lt;br /&gt;
&lt;br /&gt;
Если ее значение больше, чем в другой итерации, то параметры смеси заменяются на новые.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Em graph.png]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Желтые вершины - вычисление функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма и функции правдоподобия на разных итерациях происходит независимо от других, затем они завершаются и первый процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Первому процессу поручим принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на загрузку данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8196.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24931</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24931"/>
		<updated>2017-12-03T18:21:14Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&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;L(X, λ, p)=Σ_{i=1}^{n}log(Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском параметров пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется ЕМ алгоритм для разделения смеси. &lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &lt;br /&gt;
&lt;br /&gt;
После каждой итерации получаем параметры распределения. Считаем функцию правдоподобия. &lt;br /&gt;
&lt;br /&gt;
Если ее значение больше, чем в другой итерации, то параметры смеси заменяются на новые.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Em graph.png]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Желтые вершины - вычисление функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма и функции правдоподобия на разных итерациях происходит независимо от других, затем они завершаются и первый процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Первому процессу поручим принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на загрузку данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8196.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24930</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24930"/>
		<updated>2017-12-03T18:20:54Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&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;L(X, λ, p)=Σ_{i=1}^{n}log(Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}})&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском параметров пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется ЕМ алгоритм для разделения смеси. &lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &lt;br /&gt;
&lt;br /&gt;
После каждой итерации получаем параметры распределения. Считаем функцию правдоподобия. &lt;br /&gt;
&lt;br /&gt;
Если ее значение больше, чем в другой итерации, то параметры смеси заменяются на новые.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Em graph.png]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Желтые вершины - вычисление функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма и функции правдоподобия на разных итерациях происходит независимо от других, затем они завершаются и первый процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Первому процессу поручим принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на загрузку данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8196.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24929</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24929"/>
		<updated>2017-12-03T18:20:24Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&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;L(X, λ, p)=Σ_{i=1}^{n}log(Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}}), j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском параметров пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется ЕМ алгоритм для разделения смеси. &lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &lt;br /&gt;
&lt;br /&gt;
После каждой итерации получаем параметры распределения. Считаем функцию правдоподобия. &lt;br /&gt;
&lt;br /&gt;
Если ее значение больше, чем в другой итерации, то параметры смеси заменяются на новые.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Em graph.png]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Желтые вершины - вычисление функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма и функции правдоподобия на разных итерациях происходит независимо от других, затем они завершаются и первый процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Первому процессу поручим принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на загрузку данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8196.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24928</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24928"/>
		<updated>2017-12-03T18:20:01Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&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;L(X, λ, p)=Σ_{i=1}^{n}log(Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}), j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском параметров пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется ЕМ алгоритм для разделения смеси. &lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &lt;br /&gt;
&lt;br /&gt;
После каждой итерации получаем параметры распределения. Считаем функцию правдоподобия. &lt;br /&gt;
&lt;br /&gt;
Если ее значение больше, чем в другой итерации, то параметры смеси заменяются на новые.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Em graph.png]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Желтые вершины - вычисление функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма и функции правдоподобия на разных итерациях происходит независимо от других, затем они завершаются и первый процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Первому процессу поручим принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на загрузку данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8196.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24927</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24927"/>
		<updated>2017-12-03T18:18:30Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&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;L(X, λ, p)=Σ_{i=1}^{n}log(p_1), j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском параметров пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется ЕМ алгоритм для разделения смеси. &lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &lt;br /&gt;
&lt;br /&gt;
После каждой итерации получаем параметры распределения. Считаем функцию правдоподобия. &lt;br /&gt;
&lt;br /&gt;
Если ее значение больше, чем в другой итерации, то параметры смеси заменяются на новые.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Em graph.png]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Желтые вершины - вычисление функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма и функции правдоподобия на разных итерациях происходит независимо от других, затем они завершаются и первый процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Первому процессу поручим принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на загрузку данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8196.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24926</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24926"/>
		<updated>2017-12-03T18:17:39Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&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;L(X, p, λ)=Σ_{i=1}^{n}log(X_ig_{ij}^{(m)}), j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском параметров пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется ЕМ алгоритм для разделения смеси. &lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &lt;br /&gt;
&lt;br /&gt;
После каждой итерации получаем параметры распределения. Считаем функцию правдоподобия. &lt;br /&gt;
&lt;br /&gt;
Если ее значение больше, чем в другой итерации, то параметры смеси заменяются на новые.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Em graph.png]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Желтые вершины - вычисление функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма и функции правдоподобия на разных итерациях происходит независимо от других, затем они завершаются и первый процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Первому процессу поручим принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на загрузку данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8196.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24925</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24925"/>
		<updated>2017-12-03T18:16:07Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&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;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском параметров пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется ЕМ алгоритм для разделения смеси. &lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &lt;br /&gt;
&lt;br /&gt;
После каждой итерации получаем параметры распределения. Считаем функцию правдоподобия. &lt;br /&gt;
&lt;br /&gt;
Если ее значение больше, чем в другой итерации, то параметры смеси заменяются на новые.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Em graph.png]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Желтые вершины - вычисление функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма и функции правдоподобия на разных итерациях происходит независимо от других, затем они завершаются и первый процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Первому процессу поручим принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на загрузку данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8196.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24923</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24923"/>
		<updated>2017-12-03T18:08:04Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском параметров пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется ЕМ алгоритм для разделения смеси. &lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &lt;br /&gt;
&lt;br /&gt;
После каждой итерации получаем параметры распределения. Считаем функцию правдоподобия. &lt;br /&gt;
&lt;br /&gt;
Если ее значение больше, чем в другой итерации, то параметры смеси заменяются на новые.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:Em graph.png]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Желтые вершины - вычисление функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма и функции правдоподобия на разных итерациях происходит независимо от других, затем они завершаются и первый процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Первому процессу поручим принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на загрузку данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8196.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24920</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24920"/>
		<updated>2017-12-03T18:04:33Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском параметров пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется ЕМ алгоритм для разделения смеси. &lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &lt;br /&gt;
&lt;br /&gt;
После каждой итерации получаем параметры распределения. Считаем функцию правдоподобия. &lt;br /&gt;
&lt;br /&gt;
Если ее значение больше, чем в другой итерации, то параметры смеси заменяются на новые.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[file: em_graph.png|400px]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Желтые вершины - вычисление функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма и функции правдоподобия на разных итерациях происходит независимо от других, затем они завершаются и первый процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Первому процессу поручим принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на загрузку данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8196.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24914</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24914"/>
		<updated>2017-12-03T17:31:39Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском параметров пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется ЕМ алгоритм для разделения смеси. &lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &lt;br /&gt;
&lt;br /&gt;
После каждой итерации получаем параметры распределения. Считаем функцию правдоподобия. &lt;br /&gt;
&lt;br /&gt;
Если ее значение больше, чем в другой итерации, то параметры смеси заменяются на новые.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[file: Raytracer_graph.png|400px]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Желтые вершины - вычисление функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма и функции правдоподобия на разных итерациях происходит независимо от других, затем они завершаются и первый процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Первому процессу поручим принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на загрузку данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8196.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24913</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24913"/>
		<updated>2017-12-03T17:29:39Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Динамические характеристики и эффективность реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском параметров пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется ЕМ алгоритм для разделения смеси. &lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &lt;br /&gt;
&lt;br /&gt;
После каждой итерации получаем параметры распределения. Считаем функцию правдоподобия. &lt;br /&gt;
&lt;br /&gt;
Если ее значение больше, чем в другой итерации, то параметры смеси заменяются на новые.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[file: Raytracer_graph.png|400px]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Желтые вершины - вычисление функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма и функции правдоподобия на разных итерациях происходит независимо от других, затем они завершаются и первый процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам, кроме первого поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Первому процессу поручим принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на загрузку данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8196.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24912</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24912"/>
		<updated>2017-12-03T17:21:41Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Динамические характеристики и эффективность реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском параметров пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется ЕМ алгоритм для разделения смеси. &lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &lt;br /&gt;
&lt;br /&gt;
После каждой итерации получаем параметры распределения. Считаем функцию правдоподобия. &lt;br /&gt;
&lt;br /&gt;
Если ее значение больше, чем в другой итерации, то параметры смеси заменяются на новые.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[file: Raytracer_graph.png|400px]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Желтые вершины - вычисление функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма и функции правдоподобия на разных итерациях происходит независимо от других, затем они завершаются и первый процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам, кроме первого поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Первому процессу поручим принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, когда время работы параллельной части алгоритма (вычисление параметров) мало по сравнению с накладными расходами MPI и временем, которое расходуется на ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8196.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм сильно масштабируется. Время выполнения алгоритма сокращается почти в 2 раза с увеличением количества ресурсов в 2 раза.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24911</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24911"/>
		<updated>2017-12-03T17:17:03Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Динамические характеристики и эффективность реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском параметров пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется ЕМ алгоритм для разделения смеси. &lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &lt;br /&gt;
&lt;br /&gt;
После каждой итерации получаем параметры распределения. Считаем функцию правдоподобия. &lt;br /&gt;
&lt;br /&gt;
Если ее значение больше, чем в другой итерации, то параметры смеси заменяются на новые.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[file: Raytracer_graph.png|400px]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Желтые вершины - вычисление функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма и функции правдоподобия на разных итерациях происходит независимо от других, затем они завершаются и первый процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам, кроме первого поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Первому процессу поручим принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|40.402&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|20.654&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|10.998&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|3.541&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|3.568&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|3.153&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|3.690&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|6.233&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8196.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24910</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24910"/>
		<updated>2017-12-03T17:12:03Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Динамические характеристики и эффективность реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском параметров пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется ЕМ алгоритм для разделения смеси. &lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &lt;br /&gt;
&lt;br /&gt;
После каждой итерации получаем параметры распределения. Считаем функцию правдоподобия. &lt;br /&gt;
&lt;br /&gt;
Если ее значение больше, чем в другой итерации, то параметры смеси заменяются на новые.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[file: Raytracer_graph.png|400px]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Желтые вершины - вычисление функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма и функции правдоподобия на разных итерациях происходит независимо от других, затем они завершаются и первый процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам, кроме первого поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Первому процессу поручим принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|479.915&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|492.614&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|313.172&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|170.866&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|82.375&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|43.812&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|22.318&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|12.195&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8196.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|647.435&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|323.948&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|162.607&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|83.009&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|42.897&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|23.928&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|16.545&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24909</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24909"/>
		<updated>2017-12-03T17:08:02Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Динамические характеристики и эффективность реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском параметров пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется ЕМ алгоритм для разделения смеси. &lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &lt;br /&gt;
&lt;br /&gt;
После каждой итерации получаем параметры распределения. Считаем функцию правдоподобия. &lt;br /&gt;
&lt;br /&gt;
Если ее значение больше, чем в другой итерации, то параметры смеси заменяются на новые.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[file: Raytracer_graph.png|400px]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Желтые вершины - вычисление функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма и функции правдоподобия на разных итерациях происходит независимо от других, затем они завершаются и первый процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам, кроме первого поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Первому процессу поручим принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|479.915&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|492.614&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|313.172&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|170.866&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|82.375&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|43.812&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|22.318&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|12.195&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
б) Количество данных - 100000, количество итераций 8196.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Ломоносов не досчитал, время вышло&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|492.614&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|313.172&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|170.866&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|82.375&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|43.812&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|22.318&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|12.195&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24908</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24908"/>
		<updated>2017-12-03T17:05:04Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Динамические характеристики и эффективность реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском параметров пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется ЕМ алгоритм для разделения смеси. &lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &lt;br /&gt;
&lt;br /&gt;
После каждой итерации получаем параметры распределения. Считаем функцию правдоподобия. &lt;br /&gt;
&lt;br /&gt;
Если ее значение больше, чем в другой итерации, то параметры смеси заменяются на новые.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[file: Raytracer_graph.png|400px]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Желтые вершины - вычисление функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма и функции правдоподобия на разных итерациях происходит независимо от других, затем они завершаются и первый процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам, кроме первого поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Первому процессу поручим принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|479.915&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|492.614&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|313.172&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|170.866&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|82.375&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|43.812&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|22.318&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|12.195&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24907</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24907"/>
		<updated>2017-12-03T17:04:34Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Динамические характеристики и эффективность реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском параметров пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется ЕМ алгоритм для разделения смеси. &lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &lt;br /&gt;
&lt;br /&gt;
После каждой итерации получаем параметры распределения. Считаем функцию правдоподобия. &lt;br /&gt;
&lt;br /&gt;
Если ее значение больше, чем в другой итерации, то параметры смеси заменяются на новые.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[file: Raytracer_graph.png|400px]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Желтые вершины - вычисление функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма и функции правдоподобия на разных итерациях происходит независимо от других, затем они завершаются и первый процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам, кроме первого поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Первому процессу поручим принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
a) Количество данных - 100000, количество итераций 256.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|479.915&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|492.614&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|313.172&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|170.866&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|82.375&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|43.812&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|22.318&lt;br /&gt;
|-&lt;br /&gt;
|128&lt;br /&gt;
|12.195&lt;br /&gt;
|-&lt;br /&gt;
|256&lt;br /&gt;
|8.793&lt;br /&gt;
|-&lt;br /&gt;
|512&lt;br /&gt;
|6.954&lt;br /&gt;
|-&lt;br /&gt;
|1024&lt;br /&gt;
|6.741&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24906</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24906"/>
		<updated>2017-12-03T17:03:16Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Динамические характеристики и эффективность реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском параметров пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется ЕМ алгоритм для разделения смеси. &lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &lt;br /&gt;
&lt;br /&gt;
После каждой итерации получаем параметры распределения. Считаем функцию правдоподобия. &lt;br /&gt;
&lt;br /&gt;
Если ее значение больше, чем в другой итерации, то параметры смеси заменяются на новые.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[file: Raytracer_graph.png|400px]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Желтые вершины - вычисление функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма и функции правдоподобия на разных итерациях происходит независимо от других, затем они завершаются и первый процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам, кроме первого поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Первому процессу поручим принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|impi 5.1.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24905</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24905"/>
		<updated>2017-12-03T17:01:34Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском параметров пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется ЕМ алгоритм для разделения смеси. &lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &lt;br /&gt;
&lt;br /&gt;
После каждой итерации получаем параметры распределения. Считаем функцию правдоподобия. &lt;br /&gt;
&lt;br /&gt;
Если ее значение больше, чем в другой итерации, то параметры смеси заменяются на новые.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Вычислим последовательную сложность алгоритма, основываясь на начальных данных и количестве повторов итераций запуска ЕМ алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[file: Raytracer_graph.png|400px]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Желтые вершины - вычисление функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма и функции правдоподобия на разных итерациях происходит независимо от других, затем они завершаются и первый процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам, кроме первого поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Первому процессу поручим принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24904</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24904"/>
		<updated>2017-12-03T17:00:10Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском параметров пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется ЕМ алгоритм для разделения смеси. &lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &lt;br /&gt;
&lt;br /&gt;
После каждой итерации получаем параметры распределения. Считаем функцию правдоподобия. &lt;br /&gt;
&lt;br /&gt;
Если ее значение больше, чем в другой итерации, то параметры смеси заменяются на новые.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&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;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[file: Raytracer_graph.png|400px]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Желтые вершины - вычисление функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма и функции правдоподобия на разных итерациях происходит независимо от других, затем они завершаются и первый процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам, кроме первого поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Первому процессу поручим принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24903</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24903"/>
		<updated>2017-12-03T16:59:57Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском параметров пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется ЕМ алгоритм для разделения смеси. &lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &lt;br /&gt;
&lt;br /&gt;
После каждой итерации получаем параметры распределения. Считаем функцию правдоподобия. &lt;br /&gt;
&lt;br /&gt;
Если ее значение больше, чем в другой итерации, то параметры смеси заменяются на новые.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&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;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[file: Raytracer_graph.png|400px]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Желтые вершины - вычисление функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма и функции правдоподобия на разных итерациях происходит независимо от других, затем они завершаются и первый процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам, кроме первого поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Первому процессу поручим принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{k \cdot w \cdot h \cdot}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24902</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24902"/>
		<updated>2017-12-03T16:59:15Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском параметров пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется ЕМ алгоритм для разделения смеси. &lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &lt;br /&gt;
&lt;br /&gt;
После каждой итерации получаем параметры распределения. Считаем функцию правдоподобия. &lt;br /&gt;
&lt;br /&gt;
Если ее значение больше, чем в другой итерации, то параметры смеси заменяются на новые.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&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;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[file: Raytracer_graph.png|400px]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Желтые вершины - вычисление функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма и функции правдоподобия на разных итерациях происходит независимо от других, затем они завершаются и первый процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам, кроме первого поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Первому процессу поручим принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(k \cdot w \cdot h \cdot N_{rays}}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24901</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24901"/>
		<updated>2017-12-03T16:58:04Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском параметров пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется ЕМ алгоритм для разделения смеси. &lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &lt;br /&gt;
&lt;br /&gt;
После каждой итерации получаем параметры распределения. Считаем функцию правдоподобия. &lt;br /&gt;
&lt;br /&gt;
Если ее значение больше, чем в другой итерации, то параметры смеси заменяются на новые.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&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;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[file: Raytracer_graph.png|400px]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Желтые вершины - вычисление функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма и функции правдоподобия на разных итерациях происходит независимо от других, затем они завершаются и первый процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам, кроме первого поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Первому процессу поручим принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{depth_{max}\cdot N_{obj} \cdot N_{lights} \cdot w \cdot h \cdot N_{rays}}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24900</id>
		<title>EM Алгоритм для пуассон трехточечного распределения</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=EM_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%83%D0%B0%D1%81%D1%81%D0%BE%D0%BD_%D1%82%D1%80%D0%B5%D1%85%D1%82%D0%BE%D1%87%D0%B5%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=24900"/>
		<updated>2017-12-03T16:55:42Z</updated>

		<summary type="html">&lt;p&gt;Victoria Evstefeeva: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
EM-алгоритм (англ. expectation-maximization) - алгоритм итерационного типа для численного решения задачи поиска экстремума целевой функции в разнообразных задачах оптимизации. В частности, алгоритм используется в математической статистике для нахождения оценок максимального правдоподобия параметров вероятностных моделей, в случае, когда модель зависит от некоторых скрытых переменных. Каждая итерация алгоритма состоит из двух шагов. На E-шаге (expectation) вычисляется ожидаемое значение функции правдоподобия, при этом скрытые переменные рассматриваются как наблюдаемые. На M-шаге (maximization) вычисляется оценка максимального правдоподобия, таким образом увеличивается ожидаемое правдоподобие, вычисляемое на E-шаге. Затем это значение используется для E-шага на следующей итерации. Алгоритм выполняется до сходимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как правило, ЕМ-алгоритм применяется для решения задач двух типов.&lt;br /&gt;
&lt;br /&gt;
• К первому типу можно отнести задачи, связанные с анализом действительно неполных данных, когда некоторые статистические данные отсутствуют в силу каких-либо причин.&lt;br /&gt;
&lt;br /&gt;
• Ко второму типу задач можно отнести статистические задачи, в которых функция правдоподобия имеет вид, не допускающий удобных аналитических методов исследования, но допускающий серьезные упрощения, если в задачу ввести дополнительные «ненаблюдаемые» (скрытые, латентные) переменные. Примерами прикладных задач второго типа являются задачи распознавания образов, реконструкции изображений. Математическую суть данных задач составляют задачи кластерного анализа, классификации и разделения смесей вероятностных распределений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Задача отыскания наиболее правдопободных оценок параметров смесей вероятностных распределений является одним из самых популярных приложений ЕМ-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Базовым предположением в рамках данной задачи является то, что плотность наблюдаемой случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{θ}^{X}=Σ_{i=1}^{k}p_{i}ψ_{i}(x; t_{i}),&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;k\geqslant 1&amp;lt;/math&amp;gt; - известное натуральное число, &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; - известные плотности распределения, неизвестный параметр &amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt; имеет вид &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; причем &amp;lt;math&amp;gt;p_{i}\geqslant 0,&amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt;i = 1, ..., k,&amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt; p_{1}+...+p_{k}=1,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;t_{i},&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; i=1,...,k,&amp;lt;/math&amp;gt; - вообще говоря, многомерные параметры. Плотности &amp;lt;math&amp;gt;ψ_{1}, ..., ψ_{k}&amp;lt;/math&amp;gt; будем называть компонентами смеси, параметры &amp;lt;math&amp;gt;p_{1}, ..., p_{k}&amp;lt;/math&amp;gt; будем называть весами соответствующих компонент.&lt;br /&gt;
&lt;br /&gt;
Задачей разделения смеси принято называть задачу статистического оценивания параметров &amp;lt;math&amp;gt;θ=(p_{1}, ..., p_{k}, t_{1},..., t_{k}),&amp;lt;/math&amp;gt; по известным реализациям случайно величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt;.&lt;br /&gt;
Оценивание параметров смешанных пуассоновских моделей сводится к оцениванию смешивающего распределения. Традиционно с этой целью используется классический ЕМ алгоритм. В случае Пуассон трехточечного распределения случайной величины &amp;lt;math&amp;gt;Χ&amp;lt;/math&amp;gt; функция плотности относительно считающей меры имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{λ, p}^{X}=Σ_{i=1}^{k}p_{i}\frac{λ_{i}^{x}e^{-λ_{i}}}{x!},&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;λ&amp;lt;/math&amp;gt; - трехточечная случайная величина, то есть принимает значения  &amp;lt;math&amp;gt;λ_{1}, λ_{2}, λ_{3}&amp;lt;/math&amp;gt; с вероятностями &amp;lt;math&amp;gt;p_{1}, p_{2}, p_{3}&amp;lt;/math&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Итерационный ЕМ-алгоритм для оценивания неизвестных параметров &amp;lt;math&amp;gt;p_1,p_2,p_3,λ1,λ_2,λ_3&amp;lt;/math&amp;gt; определяется следующим образом.&lt;br /&gt;
Дана выборка &amp;lt;math&amp;gt;X_1, ..., X_n&amp;lt;/math&amp;gt; независимых одинаково распределенных случайных величин таких, что &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;P(X_i = k)=\frac{1}{k!}Σ_{j=1}^{3}p_{j}λ_{j}^{k}e^{-λ_{j}},   k = 0,1,2,...,&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;p_j \geqslant 0, λ_j &amp;gt; 0, j = \{1, 2, 3\}&amp;lt;/math&amp;gt; - неизвестные параметры, &amp;lt;math&amp;gt;p_1+p_2+p_3=1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p^{(m)}_1, p^{(m)}_2 , p^{(m)}_3, λ_1^{(m)}, λ_2^{(m)}, λ_3^{(m)}&amp;lt;/math&amp;gt; – оценки этих параметров, полученные на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-й итерации. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом ЕМ алгоритм для случая пуассон-трехточечного распределения состоит из следующих шагов:&lt;br /&gt;
&lt;br /&gt;
1 шаг алгоритма - вычисление условного математического ожидания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;g_{ij}^{(m)} = \frac{p_j^{(m)}e^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}{Σ_{j=1}^{3}p_je^{-λ_j^{(m)}}(λ_j^{(m)})^{X_i}}, i=1,..., n&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2 шаг алгоритма - оценивание неизвестных параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p_j^{(m+1)}=\frac{1}{n}Σ_{i=1}^{n}g_{ij}^{(m)}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;λ_j^{(m+1)}=\frac{Σ_{i=1}^{n}X_ig_{ij}^{(m)}}{Σ_{i=1}^{n}g_{ij}^{(m)}}, j = \{1, 2, 3\}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основные вычисления связаны с поиском параметров пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
К исходным данным из пуассон-трехточечного распределения применяется ЕМ алгоритм для разделения смеси. &lt;br /&gt;
&lt;br /&gt;
Проводится несколько итераций запуска ЕМ алгоритма на данных. &lt;br /&gt;
&lt;br /&gt;
После каждой итерации получаем параметры распределения. Считаем функцию правдоподобия. &lt;br /&gt;
&lt;br /&gt;
Если ее значение больше, чем в другой итерации, то параметры смеси заменяются на новые.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Здесь приведены основные моменты алгоритма.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// Плотность пуассоновского распределения&lt;br /&gt;
double poisson_pdf(int x, double lambda_)&lt;br /&gt;
{&lt;br /&gt;
    return pow(lambda_,x) * exp(-lambda_) / factorial(x);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция правдоподобия для пуассон-трехточечного распределения&lt;br /&gt;
double likelihood(vector&amp;lt;int&amp;gt; &amp;amp;X, double *lambda_, double *p)&lt;br /&gt;
{&lt;br /&gt;
    double summation = 0.0;&lt;br /&gt;
    for (int n = 0, length_ext = X.size(); n &amp;lt;  length_ext; ++n)&lt;br /&gt;
    {&lt;br /&gt;
        double temp = 0.0;&lt;br /&gt;
        for (int k = 0; k &amp;lt; 3; ++k)&lt;br /&gt;
            temp += p[k] * poisson_pdf(X[n], lambda_[k]);&lt;br /&gt;
        summation += log(temp);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return summation;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//Вычисление начального приближения для EM алгоритма&lt;br /&gt;
double p[3], lambda_[3];&lt;br /&gt;
double minim = -100000.0;&lt;br /&gt;
double sum = 0.0;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    p[i] = rand() % 13371337 + 1;&lt;br /&gt;
    sum += p[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt;  K; ++i)&lt;br /&gt;
    p[i] /= sum;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; K; ++i)&lt;br /&gt;
{&lt;br /&gt;
    sum = 0.0;&lt;br /&gt;
    int j, l = 0;&lt;br /&gt;
    if (i == 0)&lt;br /&gt;
        j = 0;&lt;br /&gt;
    else&lt;br /&gt;
        j = int(N*p[i-1]);&lt;br /&gt;
    for (int q = j;  q &amp;lt; int(N*p[i]); ++q)&lt;br /&gt;
        sum += X[q];&lt;br /&gt;
        l += 1;&lt;br /&gt;
    lambda_[i] = sum/l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double likely = likelihood(X, lambda_, p);&lt;br /&gt;
double like = minim;&lt;br /&gt;
if (likely &amp;gt; minim)&lt;br /&gt;
    like = likely;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
// ЕМ алгоритм&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    //E-шаг&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        double denominator = 0.0;&lt;br /&gt;
        for  (int j = 0; j &amp;lt; K; ++j)&lt;br /&gt;
            denominator += p[j] * poisson_pdf(X[i], lambda_[j]);&lt;br /&gt;
        for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
            gamma[i][k] = p[k] * poisson_pdf(X[i], lambda_[k]) / denominator;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //M-шаг&lt;br /&gt;
    for (int k = 0; k &amp;lt; K; ++k)&lt;br /&gt;
    {&lt;br /&gt;
        double Nk = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            Nk += gamma[n][k];&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем среднее&lt;br /&gt;
        lambda_[k] = 0.0;&lt;br /&gt;
        for (int n = 0; n &amp;lt; N; ++n)&lt;br /&gt;
            lambda_[k] += gamma[n][k] * X[n];&lt;br /&gt;
        lambda_[k] /= Nk;&lt;br /&gt;
&lt;br /&gt;
        //Вычисляем коэффициенты смешивания&lt;br /&gt;
        p[k] = Nk / N;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double new_like = likelihood(X, lambda_, p);&lt;br /&gt;
    double diff = new_like - like;&lt;br /&gt;
    if (isnan(diff))&lt;br /&gt;
        break;&lt;br /&gt;
    if (abs(diff) &amp;lt; 0.0000000001)&lt;br /&gt;
        break;&lt;br /&gt;
    like = new_like;&lt;br /&gt;
}&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;
&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - количество итераций запуска ЕМ алгоритма&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; - количество данных&lt;br /&gt;
&lt;br /&gt;
На каждой итерации ищутся параметры смеси: &amp;lt;math&amp;gt;k\cdot O(h)&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;O(k \cdot w \cdot h)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[file: Raytracer_graph.png|400px]]&lt;br /&gt;
&lt;br /&gt;
Зеленые вершины - вычисление параметров ЕМ алгоритма.&amp;lt;br&amp;gt;&lt;br /&gt;
Желтые вершины - вычисление функции правдоподобия.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что вычисление параметров ЕМ алгоритма и функции правдоподобия на разных итерациях происходит независимо от других, затем они завершаются и первый процесс записывает результат в файл. Пусть &amp;lt;math&amp;gt;N_p \geqslant 2&amp;lt;/math&amp;gt; - количество процессов. Всем процессам, кроме первого поручим выполнить часть итераций запуска ЕМ алгоритма (каждый процесс выполнит &amp;lt;math&amp;gt;\Big[\frac{w \cdot h}{N_p - 1}\Big] &amp;lt;/math&amp;gt; итераций). Первому процессу поручим принять работу и записать результат в файл.&lt;br /&gt;
&lt;br /&gt;
Время работы: &amp;lt;math&amp;gt;O\Big(\frac{depth_{max}\cdot N_{obj} \cdot N_{lights} \cdot w \cdot h \cdot N_{rays}}{N_p}\Big)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
На вход алгоритму подаются данные из пуассон-трехточечного распределения.&lt;br /&gt;
&lt;br /&gt;
На выходе получаем параметры смеси.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
↑ В.Ю. Королев &amp;quot;Вероятностно-статистические методы декомпозиции волатильности хаотических процессов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ В. Ю. Королев, А. Ю. Корчагин, А. И. Зейфман &amp;quot;Теорема Пуассона для схемы испытаний Бернулли со случайной вероятностью успеха и дискретный аналог распределения Вейбулла&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
↑ http://www.machinelearning.ru/wiki/index.php?title=EM-алгоритм&lt;/div&gt;</summary>
		<author><name>Victoria Evstefeeva</name></author>
	</entry>
</feed>