<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=176.59.23.40&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=176.59.23.40&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%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/176.59.23.40"/>
		<updated>2026-05-13T23:01:58Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC&amp;diff=70975</id>
		<title>EM-алгоритм</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC&amp;diff=70975"/>
				<updated>2019-04-09T09:49:00Z</updated>
		
		<summary type="html">&lt;p&gt;176.59.23.40: /* Общий алгоритм */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Определение ==&lt;br /&gt;
&lt;br /&gt;
'''Алгоритм EM''' --- алгоритм поиска максимума правдоподобия параметров для решения задач, где некоторые переменные не являются наблюдаемыми. &lt;br /&gt;
&lt;br /&gt;
Алгоритм ищет параметры модели итеративно, каждая итерация состоит из двух шагов:&lt;br /&gt;
&lt;br /&gt;
'''E(Expectation''') шаг, в котором находится распределение скрытых переменных используя значение наблюдаемых переменных и текущего значения параметров.&lt;br /&gt;
&lt;br /&gt;
'''M(Maximisation)''' шаг --- пересчет параметров, находя максимум правдоподобия исходя из распределения скрытых переменных, полученных на E-шаге.&lt;br /&gt;
&lt;br /&gt;
== Задача разделения смеси распределений == &lt;br /&gt;
&lt;br /&gt;
=== Общий алгоритм ===&lt;br /&gt;
&lt;br /&gt;
Необходимо описать плотность распределения функции на X как сумму k функций, которые можно рассматривать как элементы параметрического семейства функций &amp;lt;tex&amp;gt; p_j(x) = \phi(x;\theta_j)&amp;lt;/tex&amp;gt;. Плотность распределения будет выглядеть как &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;p(x) = \sum\limits_{i=1}^k \omega_j p_j(x);   \sum\limits_{i=1}^k w_j = 1;  w_j &amp;gt;= 0 &amp;lt;/tex&amp;gt;  &lt;br /&gt;
&amp;lt;br /&amp;gt;  где &amp;lt;tex&amp;gt;\omega_j&amp;lt;/tex&amp;gt;- априорная вероятность j компоненты распределения.&lt;br /&gt;
Задача разделения смеси заключается в том, чтобы, имея выборку &amp;lt;tex&amp;gt;X^m&amp;lt;/tex&amp;gt; случайных и независимых наблюдений из смеси &amp;lt;tex&amp;gt;p(x)&amp;lt;/tex&amp;gt;, зная число &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; и функцию &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;, оценить вектор параметров &amp;lt;tex&amp;gt;\theta = (\omega_1,..,\omega_k,\theta_1,..,\theta_k)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E-шаг:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;p(x,\theta_j) = p(x)P(\theta_j | x) = w_jp_j(x)&amp;lt;/tex&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Введем обозначение: &amp;lt;tex&amp;gt; g_{ij} = P(\theta_j | x_i) &amp;lt;/tex&amp;gt; это и будут скрытые параметры данной задачи - апостериорная вероятность того, что обучающий объект &amp;lt;tex&amp;gt; x_i &amp;lt;/tex&amp;gt; получен из &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;-й компоненты  &lt;br /&gt;
&lt;br /&gt;
По формуле Байеса справедливо равенство:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt; g_{ij} = \frac{w_jp_j(x_i)}{\sum\limits_{t=1}^k w_t p_t(x_i)}&amp;lt;/tex&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Таким образом при зная значение параметров легко найти скрытые переменные.&lt;br /&gt;
&lt;br /&gt;
Перейдем к M-шагу.&lt;br /&gt;
&lt;br /&gt;
Посчитаем для аддитивности логарифм правдоподобия:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt; Q(\Theta) = ln \prod\limits_{i=1}^mp(x_i) = \sum\limits_{i=1}^m ln\sum\limits_{j=1}^k w_j p_j(x_i) \longrightarrow max&amp;lt;/tex&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
при условии &amp;lt;tex&amp;gt;\sum\limits_{i=1}^k w_j = 1; w_j &amp;gt;= 0&amp;lt;/tex&amp;gt; имеет смысл рассматривать лагранжиан задачи:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;\frac{\partial L} {\partial w_j} = \sum\limits_{i=1}^m \frac{p_j(x_i)}{\sum\limits_{t=1}^kw_tp_t(x_i)} - \lambda = 0.&amp;lt;/tex&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Умножим на &amp;lt;tex&amp;gt;\omega_j&amp;lt;/tex&amp;gt; и просуммируем уравнения для всех &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{j=1}^k \sum\limits_{i=1}^m \frac{w_jp_j(x_i)}{\sum\limits_{t=1}^kw_tp_t(x_i)} = \lambda \sum\limits_{j=1}^kw_j&amp;lt;/tex&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как можно заменить порядок суммы и &amp;lt;tex&amp;gt;\sum\limits_{i=1}^m \frac{w_jp_j(x_i)}{\sum\limits_{t=1}^kw_tp_t(x_i)} = 1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\sum\limits_{j=1}^kw_j = 1&amp;lt;/tex&amp;gt;, из чего следует &amp;lt;tex&amp;gt;\lambda = m&amp;lt;/tex&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\omega_j = \frac{1}{m}\sum\limits_{i=1}^m \frac{w_jp_j(x_i)}{\sum\limits_{t=1}^kw_tp_t(x_i)} = \frac{1}{m}\sum\limits_{i=1}^mg_{ij}&amp;lt;/tex&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Приравняв к нулю лагранжиан по &amp;lt;tex&amp;gt;\theta_j&amp;lt;/tex&amp;gt; схожим способом найдем:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; \theta_j = \arg\max\limits{\theta}\sum\limits_{i=1}^mg_{ij}\ln(\phi(x_i;\theta)).&amp;lt;/tex&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом на M-шаге необходимо взять среднее значение &amp;lt;tex&amp;gt;g_{ij}&amp;lt;/tex&amp;gt; и решить k независимых оптимизационных задач.&lt;br /&gt;
&lt;br /&gt;
=== Разделение смеси гауссиан ===&lt;br /&gt;
[[Файл:Gaussians.png|right|250px| Несколько итераций алгоритма]]&lt;br /&gt;
Важным на практике примером является случай, когда параметрическое семейство - нормальные распределения. Параметрами функций будут являться матожидание и дисперсия.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;\theta = (w_1,..,w_k;\;\mu_1,..,\mu_k;\;\sigma_1,..,\sigma_k)&amp;lt;/tex&amp;gt; — вектор параметров, &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;p_j(x) = N(x;\mu_j, \sigma_j) = \frac1{\sqrt{2\pi}\sigma_j} \exp \biggl(-\frac{(x - \mu_j)^2}{2\sigma_j^2}\biggr) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== k-means как EM алгоритм ==&lt;br /&gt;
[[Файл:kmeans.jpg|right|250px|K-means]]&lt;br /&gt;
Скрытыми переменными в данной задаче являются классы, к которым относятся объекты для кластеризации. Сами же параметры это центры масс классов. На шаге E - распределяются все объекты по классам исходя из расстояния от центра, на шаге M находится оптимальное месторасположение центра.&lt;br /&gt;
&lt;br /&gt;
Аналогично рассматривается и алгоритм c-means. Скрытые переменные здесь будут вероятности принадлежности к классам, которые находятся на E-шаге по расстоянию от центра. Центр так же рассчитывается на M-шаге исходя из скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
== Реализация на python ==&lt;br /&gt;
&lt;br /&gt;
 '''import''' numpy as np&lt;br /&gt;
 '''import''' matplotlib.pyplot as plt&lt;br /&gt;
 '''from''' sklearn '''import''' cluster, datasets, mixture&lt;br /&gt;
 '''from''' sklearn.preprocessing '''import''' StandardScaler&lt;br /&gt;
 '''from''' itertools '''import''' cycle, islice&lt;br /&gt;
 np.random.seed(12)&lt;br /&gt;
 &lt;br /&gt;
 # Создаем datasets с использованием стандартных sklearn.datasets&lt;br /&gt;
 n_samples = 2000&lt;br /&gt;
 random_state = 170&lt;br /&gt;
 noisy_circles = datasets.make_circles(n_samples=n_samples, factor=.5, noise=.05)&lt;br /&gt;
 noisy_moons = datasets.make_moons(n_samples=n_samples, noise=.05)&lt;br /&gt;
 blobs = datasets.make_blobs(n_samples=n_samples, random_state=8)&lt;br /&gt;
 varied = datasets.make_blobs(n_samples=n_samples, cluster_std=[1.0, 2.5, 0.5], random_state=random_state)&lt;br /&gt;
 &lt;br /&gt;
 # Создаем анизатропно разделенные данные&lt;br /&gt;
 X, y = datasets.make_blobs(n_samples=n_samples, random_state=random_state)&lt;br /&gt;
 transformation = [[0.6, -0.6], [-0.4, 0.8]]&lt;br /&gt;
 X_aniso = np.dot(X, transformation)&lt;br /&gt;
 aniso = (X_aniso, y)&lt;br /&gt;
 &lt;br /&gt;
 # Выставляем параметры для matplotlib.pyplot&lt;br /&gt;
 plt.figure(figsize=(9 * 2 + 3, 12.5))&lt;br /&gt;
 plt.subplots_adjust(left=.02, right=.98, bottom=.001, top=.96, wspace=.05, hspace=.01)&lt;br /&gt;
 plot_num = 1&lt;br /&gt;
 defaul_n = 3&lt;br /&gt;
 &lt;br /&gt;
 # Варьируем значение количества классов в зависимости от данных, ведь для нас это гиперпараметр&lt;br /&gt;
 datasets = [&lt;br /&gt;
    (varied, defaul_n),&lt;br /&gt;
    (aniso, defaul_n),&lt;br /&gt;
    (blobs, defaul_n),&lt;br /&gt;
    (noisy_circles, 2)]&lt;br /&gt;
 for i_dataset, (dataset, n_cluster) in enumerate(datasets):&lt;br /&gt;
    X, y = dataset&lt;br /&gt;
 &lt;br /&gt;
    # Нормализация данных&lt;br /&gt;
    X = StandardScaler().fit_transform(X)&lt;br /&gt;
 &lt;br /&gt;
    # Непосредственно наш алгоритм - Gaussian Mixture&lt;br /&gt;
    gmm = mixture.GaussianMixture(n_components=n_cluster, covariance_type='full')&lt;br /&gt;
    &lt;br /&gt;
    # Для сравнения берем алгоритм - K-means&lt;br /&gt;
    two_means = cluster.KMeans(n_clusters=n_cluster)&lt;br /&gt;
    clustering_algorithms = (&lt;br /&gt;
        ('GaussianMixture', gmm),&lt;br /&gt;
        ('KMeans', two_means)&lt;br /&gt;
    )&lt;br /&gt;
    for name, algorithm in clustering_algorithms:&lt;br /&gt;
 &lt;br /&gt;
        # Этап обучения&lt;br /&gt;
        algorithm.fit(X)&lt;br /&gt;
        &lt;br /&gt;
        # Применяем алгоритм&lt;br /&gt;
        y_pred = algorithm.predict(X)&lt;br /&gt;
        &lt;br /&gt;
        # Рисуем результаты&lt;br /&gt;
        plt.subplot(len(datasets), len(clustering_algorithms), plot_num)&lt;br /&gt;
        if i_dataset == 0:&lt;br /&gt;
            plt.title(name, size=18)&lt;br /&gt;
        colors = np.array(list(islice(cycle(['#377eb8', '#ff7f00', '#4daf4a']), int(max(y_pred) + 1))))&lt;br /&gt;
        plt.scatter(X[:, 0], X[:, 1], s=10, color=colors[y_pred])&lt;br /&gt;
        plt.xlim(-2.5, 2.5)&lt;br /&gt;
        plt.ylim(-2.5, 2.5)&lt;br /&gt;
        plt.xticks(())&lt;br /&gt;
        plt.yticks(())&lt;br /&gt;
        plot_num += 1&lt;br /&gt;
 plt.show()&lt;br /&gt;
&lt;br /&gt;
[[Файл:Prog.png|thumb|250px|Результат программы]]&lt;br /&gt;
&lt;br /&gt;
Как и следовало ожидать, алгоритм работает на некоторых данных лучше чем k-means, однако есть данные, с которыми он не справляется без дополнительных преобразований.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Кластеризация]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/images/6/6d/Voron-ML-1.pdf Математические методы обучения по прецедентам К. В. Воронцов]&lt;br /&gt;
# [http://dendroid.sk/2011/05/09/k-means-clustering/ k-means]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Машинное обучение]]&lt;/div&gt;</summary>
		<author><name>176.59.23.40</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC&amp;diff=70974</id>
		<title>EM-алгоритм</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=EM-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC&amp;diff=70974"/>
				<updated>2019-04-09T09:46:54Z</updated>
		
		<summary type="html">&lt;p&gt;176.59.23.40: /* Определение */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Определение ==&lt;br /&gt;
&lt;br /&gt;
'''Алгоритм EM''' --- алгоритм поиска максимума правдоподобия параметров для решения задач, где некоторые переменные не являются наблюдаемыми. &lt;br /&gt;
&lt;br /&gt;
Алгоритм ищет параметры модели итеративно, каждая итерация состоит из двух шагов:&lt;br /&gt;
&lt;br /&gt;
'''E(Expectation''') шаг, в котором находится распределение скрытых переменных используя значение наблюдаемых переменных и текущего значения параметров.&lt;br /&gt;
&lt;br /&gt;
'''M(Maximisation)''' шаг --- пересчет параметров, находя максимум правдоподобия исходя из распределения скрытых переменных, полученных на E-шаге.&lt;br /&gt;
&lt;br /&gt;
== Задача разделения смеси распределений == &lt;br /&gt;
&lt;br /&gt;
=== Общий алгоритм ===&lt;br /&gt;
&lt;br /&gt;
Необходимо описать плотность распределения функции на X как сумму k функций, которые можно рассматривать как элементы параметрического семейства функций &amp;lt;tex&amp;gt; p_j(x) = \phi(x;\theta_j)&amp;lt;/tex&amp;gt;. Плотность распределения будет выглядеть как &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;p(x) = \sum\limits_{i=1}^k \omega_j p_j(x);   \sum\limits_{i=1}^k w_j = 1;  w_j &amp;gt;= 0 &amp;lt;/tex&amp;gt;  &lt;br /&gt;
&amp;lt;br /&amp;gt;  где &amp;lt;tex&amp;gt;\omega_j&amp;lt;/tex&amp;gt;- априорная вероятность j компоненты распределения.&lt;br /&gt;
Задача разделения смеси заключается в том, чтобы, имея выборку &amp;lt;tex&amp;gt;X^m&amp;lt;/tex&amp;gt; случайных и независимых наблюдений из смеси &amp;lt;tex&amp;gt;p(x)&amp;lt;/tex&amp;gt;, зная число &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; и функцию &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;, оценить вектор параметров &amp;lt;tex&amp;gt;\theta = (\omega_1,..,\omega_k,\theta_1,..,\theta_k)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E-шаг:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;p(x,\theta_j) = p(x)P(\theta_j | x) = w_jp_j(x)&amp;lt;/tex&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Введем обозначение: &amp;lt;tex&amp;gt; g_{ij} = P(\theta_j | x_i) &amp;lt;/tex&amp;gt; это и будут скрытые параметры данной задачи - апостериорная вероятность того, что обучающий объект &amp;lt;tex&amp;gt; x_i &amp;lt;/tex&amp;gt; получен из &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;-й компоненты  &lt;br /&gt;
&lt;br /&gt;
По формуле Байеса справедливо равенство:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt; g_{ij} = \frac{w_jp_j(x_i)}{\sum\limits_{t=1}^k w_t p_t(x_i)}&amp;lt;/tex&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Таким образом при зная значение параметров легко найти скрытые переменные.&lt;br /&gt;
&lt;br /&gt;
Перейдем к M-шагу:&lt;br /&gt;
&lt;br /&gt;
Посчитаем для аддитивности логарифм правдоподобия:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt; Q(\Theta) = ln \prod\limits_{i=1}^mp(x_i) = \sum\limits_{i=1}^m ln\sum\limits_{j=1}^k w_j p_j(x_i) \longrightarrow max&amp;lt;/tex&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
при условии &amp;lt;tex&amp;gt;\sum\limits_{i=1}^k w_j = 1; w_j &amp;gt;= 0&amp;lt;/tex&amp;gt; имеет смысл рассматривать лагранжиан задачи:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;\frac{\partial L} {\partial w_j} = \sum\limits_{i=1}^m \frac{p_j(x_i)}{\sum\limits_{t=1}^kw_tp_t(x_i)} - \lambda = 0&amp;lt;/tex&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Умножим на &amp;lt;tex&amp;gt;\omega_j&amp;lt;/tex&amp;gt; и просумируем уравнения для всех &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{j=1}^k \sum\limits_{i=1}^m \frac{w_jp_j(x_i)}{\sum\limits_{t=1}^kw_tp_t(x_i)} = \lambda \sum\limits_{j=1}^kw_j&amp;lt;/tex&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как можно заменить порядок суммы и &amp;lt;tex&amp;gt;\sum\limits_{i=1}^m \frac{w_jp_j(x_i)}{\sum\limits_{t=1}^kw_tp_t(x_i)} = 1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\sum\limits_{j=1}^kw_j = 1&amp;lt;/tex&amp;gt; из чего следует &amp;lt;tex&amp;gt;\lambda = m&amp;lt;/tex&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\omega_j = \frac{1}{m}\sum\limits_{i=1}^m \frac{w_jp_j(x_i)}{\sum\limits_{t=1}^kw_tp_t(x_i)} = \frac{1}{m}\sum\limits_{i=1}^mg_{ij}&amp;lt;/tex&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Приравняв к нулю лагранжиан по &amp;lt;tex&amp;gt;\theta_j&amp;lt;/tex&amp;gt; схожим способом найдем:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; \theta_j = arg \max\limits{\theta}\sum\limits_{i=1}^mg_{ij}ln(\phi(x_i;\theta)) &amp;lt;/tex&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом на M-шаге необходимо взять среднее значение &amp;lt;tex&amp;gt;g_{ij}&amp;lt;/tex&amp;gt; и решить k независимых оптимизационных задач.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Разделение смеси гауссиан ===&lt;br /&gt;
[[Файл:Gaussians.png|right|250px| Несколько итераций алгоритма]]&lt;br /&gt;
Важным на практике примером является случай, когда параметрическое семейство - нормальные распределения. Параметрами функций будут являться матожидание и дисперсия.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;\theta = (w_1,..,w_k;\;\mu_1,..,\mu_k;\;\sigma_1,..,\sigma_k)&amp;lt;/tex&amp;gt; — вектор параметров, &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;p_j(x) = N(x;\mu_j, \sigma_j) = \frac1{\sqrt{2\pi}\sigma_j} \exp \biggl(-\frac{(x - \mu_j)^2}{2\sigma_j^2}\biggr) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== k-means как EM алгоритм ==&lt;br /&gt;
[[Файл:kmeans.jpg|right|250px|K-means]]&lt;br /&gt;
Скрытыми переменными в данной задаче являются классы, к которым относятся объекты для кластеризации. Сами же параметры это центры масс классов. На шаге E - распределяются все объекты по классам исходя из расстояния от центра, на шаге M находится оптимальное месторасположение центра.&lt;br /&gt;
&lt;br /&gt;
Аналогично рассматривается и алгоритм c-means. Скрытые переменные здесь будут вероятности принадлежности к классам, которые находятся на E-шаге по расстоянию от центра. Центр так же рассчитывается на M-шаге исходя из скрытых переменных.&lt;br /&gt;
&lt;br /&gt;
== Реализация на python ==&lt;br /&gt;
&lt;br /&gt;
 '''import''' numpy as np&lt;br /&gt;
 '''import''' matplotlib.pyplot as plt&lt;br /&gt;
 '''from''' sklearn '''import''' cluster, datasets, mixture&lt;br /&gt;
 '''from''' sklearn.preprocessing '''import''' StandardScaler&lt;br /&gt;
 '''from''' itertools '''import''' cycle, islice&lt;br /&gt;
 np.random.seed(12)&lt;br /&gt;
 &lt;br /&gt;
 # Создаем datasets с использованием стандартных sklearn.datasets&lt;br /&gt;
 n_samples = 2000&lt;br /&gt;
 random_state = 170&lt;br /&gt;
 noisy_circles = datasets.make_circles(n_samples=n_samples, factor=.5, noise=.05)&lt;br /&gt;
 noisy_moons = datasets.make_moons(n_samples=n_samples, noise=.05)&lt;br /&gt;
 blobs = datasets.make_blobs(n_samples=n_samples, random_state=8)&lt;br /&gt;
 varied = datasets.make_blobs(n_samples=n_samples, cluster_std=[1.0, 2.5, 0.5], random_state=random_state)&lt;br /&gt;
 &lt;br /&gt;
 # Создаем анизатропно разделенные данные&lt;br /&gt;
 X, y = datasets.make_blobs(n_samples=n_samples, random_state=random_state)&lt;br /&gt;
 transformation = [[0.6, -0.6], [-0.4, 0.8]]&lt;br /&gt;
 X_aniso = np.dot(X, transformation)&lt;br /&gt;
 aniso = (X_aniso, y)&lt;br /&gt;
 &lt;br /&gt;
 # Выставляем параметры для matplotlib.pyplot&lt;br /&gt;
 plt.figure(figsize=(9 * 2 + 3, 12.5))&lt;br /&gt;
 plt.subplots_adjust(left=.02, right=.98, bottom=.001, top=.96, wspace=.05, hspace=.01)&lt;br /&gt;
 plot_num = 1&lt;br /&gt;
 defaul_n = 3&lt;br /&gt;
 &lt;br /&gt;
 # Варьируем значение количества классов в зависимости от данных, ведь для нас это гиперпараметр&lt;br /&gt;
 datasets = [&lt;br /&gt;
    (varied, defaul_n),&lt;br /&gt;
    (aniso, defaul_n),&lt;br /&gt;
    (blobs, defaul_n),&lt;br /&gt;
    (noisy_circles, 2)]&lt;br /&gt;
 for i_dataset, (dataset, n_cluster) in enumerate(datasets):&lt;br /&gt;
    X, y = dataset&lt;br /&gt;
 &lt;br /&gt;
    # Нормализация данных&lt;br /&gt;
    X = StandardScaler().fit_transform(X)&lt;br /&gt;
 &lt;br /&gt;
    # Непосредственно наш алгоритм - Gaussian Mixture&lt;br /&gt;
    gmm = mixture.GaussianMixture(n_components=n_cluster, covariance_type='full')&lt;br /&gt;
    &lt;br /&gt;
    # Для сравнения берем алгоритм - K-means&lt;br /&gt;
    two_means = cluster.KMeans(n_clusters=n_cluster)&lt;br /&gt;
    clustering_algorithms = (&lt;br /&gt;
        ('GaussianMixture', gmm),&lt;br /&gt;
        ('KMeans', two_means)&lt;br /&gt;
    )&lt;br /&gt;
    for name, algorithm in clustering_algorithms:&lt;br /&gt;
 &lt;br /&gt;
        # Этап обучения&lt;br /&gt;
        algorithm.fit(X)&lt;br /&gt;
        &lt;br /&gt;
        # Применяем алгоритм&lt;br /&gt;
        y_pred = algorithm.predict(X)&lt;br /&gt;
        &lt;br /&gt;
        # Рисуем результаты&lt;br /&gt;
        plt.subplot(len(datasets), len(clustering_algorithms), plot_num)&lt;br /&gt;
        if i_dataset == 0:&lt;br /&gt;
            plt.title(name, size=18)&lt;br /&gt;
        colors = np.array(list(islice(cycle(['#377eb8', '#ff7f00', '#4daf4a']), int(max(y_pred) + 1))))&lt;br /&gt;
        plt.scatter(X[:, 0], X[:, 1], s=10, color=colors[y_pred])&lt;br /&gt;
        plt.xlim(-2.5, 2.5)&lt;br /&gt;
        plt.ylim(-2.5, 2.5)&lt;br /&gt;
        plt.xticks(())&lt;br /&gt;
        plt.yticks(())&lt;br /&gt;
        plot_num += 1&lt;br /&gt;
 plt.show()&lt;br /&gt;
&lt;br /&gt;
[[Файл:Prog.png|thumb|250px|Результат программы]]&lt;br /&gt;
&lt;br /&gt;
Как и следовало ожидать, алгоритм работает на некоторых данных лучше чем k-means, однако есть данные, с которыми он не справляется без дополнительных преобразований.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Кластеризация]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/images/6/6d/Voron-ML-1.pdf Математические методы обучения по прецедентам К. В. Воронцов]&lt;br /&gt;
# [http://dendroid.sk/2011/05/09/k-means-clustering/ k-means]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Машинное обучение]]&lt;/div&gt;</summary>
		<author><name>176.59.23.40</name></author>	</entry>

	</feed>