EM-алгоритм — различия между версиями
Egalkin (обсуждение | вклад) (Добавил примеры использования алгоритма в задаче кластеризации) |
Egalkin (обсуждение | вклад) (Оформил докозательство теоремы из шага M) |
||
Строка 14: | Строка 14: | ||
# Задачи, в которых удобно вводить скрытые переменные для упрощения подсчета функции правдоподобия. Примером такой задачи может служить кластеризация | # Задачи, в которых удобно вводить скрытые переменные для упрощения подсчета функции правдоподобия. Примером такой задачи может служить кластеризация | ||
− | == | + | == Основной алгоритм == |
=== Постановка задачи === | === Постановка задачи === | ||
Плотность распределения смеси имеет вид:<br/> | Плотность распределения смеси имеет вид:<br/> | ||
− | <tex>p(x) = \sum\limits_{ | + | <tex>p(x) = \sum\limits_{j=1}^k \omega_j p_j(x)</tex><br/> |
− | Где <tex> \sum\limits_{ | + | Где <tex> \sum\limits_{j=1}^k w_j = 1; w_j \geq 0; p_j(x) = \phi(x;\theta_j)</tex> - функция правдоподобия <tex>j</tex>-ой компонеты смеси, <tex>\omega_j</tex> - априорная вероятность <tex>j</tex>-ой компоненты распределения.<br/> |
Перед нами стоит две задачи:<br/> | Перед нами стоит две задачи:<br/> | ||
Строка 62: | Строка 62: | ||
|statement= | |statement= | ||
Если известны скрытые переменные, то задача минимизации <tex>Q(\Theta)</tex> сводится к <tex>k</tex> независимым подзадачам:<br/> | Если известны скрытые переменные, то задача минимизации <tex>Q(\Theta)</tex> сводится к <tex>k</tex> независимым подзадачам:<br/> | ||
− | <center><tex>\theta_j = | + | <center><tex>\theta_j = \arg\max\limits{\theta}\sum\limits_{i=1}^m h_{ij}*\ln\phi(x_i;\theta)</tex></center> |
Оптимальные же веса считаются как:<br/> | Оптимальные же веса считаются как:<br/> | ||
<center><tex> w_j = \frac {1} {m} \sum\limits_{i=1}^m h_{ij}</tex></center> | <center><tex> w_j = \frac {1} {m} \sum\limits_{i=1}^m h_{ij}</tex></center> | ||
+ | |proof= | ||
+ | Посчитаем логарифм правдоподобия:<br> | ||
+ | <tex> Q(\Theta) = \sum\limits_{i=1}^m ln\sum\limits_{j=1}^k w_j p_j(x_i; \theta_j) \longrightarrow max</tex><br/> | ||
+ | При условии, что<tex> \sum\limits_{j=1}^k w_j = 1; w_j \geq 0</tex> имеет смысл рассматривать Лагранжиан задачи:<br/> | ||
+ | <tex> L(\Theta, X^m) = \sum\limits_{i=1}^m ln \biggl( \sum\limits_{j=1}^k w_j p_j(x_i) \biggr) - \lambda \biggl(\sum\limits_{j=1}^k w_j - 1 \biggr) </tex><br/> | ||
+ | Приравняв нулю производную Лагранжиана по <tex>w_j</tex>, получим:<br/> | ||
+ | <tex>\frac{\partial L} {\partial w_j} = \sum\limits_{i=1}^m \frac{p_j(x_i)}{\sum\limits_{s=1}^kw_s p_s(x_i)} - \lambda = 0, j = 1..k</tex><br /> | ||
+ | Умножим на <tex>w_j</tex> и просуммируем уравнения для всех <tex>j</tex> <br /> | ||
+ | <tex>\sum\limits_{j=1}^k \sum\limits_{i=1}^m \frac{w_jp_j(x_i)}{\sum\limits_{s=1}^kw_s p_s(x_i)} = \lambda \sum\limits_{j=1}^kw_j</tex> <br /> | ||
+ | А так как <tex>\sum\limits_{j=1}^k \frac{w_jp_j(x_i)}{\sum\limits_{s=1}^kw_sp_s(x_i)} = 1</tex> и <tex>\sum\limits_{j=1}^kw_j = 1</tex>, из чего следует <tex>\lambda = m</tex> <br /> | ||
+ | |||
+ | <tex>w_i = \frac{1}{m}\sum\limits_{i=1}^m \frac{w_jp_j(x_i)}{\sum\limits_{s=1}^kw_sp_s(x_i)} = \frac{1}{m}\sum\limits_{i=1}^m h_{ij}</tex><br /> | ||
+ | |||
+ | Приравняв к нулю лагранжиан по <tex>\theta_j</tex> схожим способом найдем:<br /> | ||
+ | |||
+ | <tex> \theta_j = \arg\max\limits{\theta}\sum\limits_{i=1}^m h_{ij}*\ln\phi(x_i;\theta).</tex><br /> | ||
+ | |||
+ | |||
}} | }} | ||
+ | |||
+ | === Критерий остановки === | ||
+ | |||
+ | Алгоритм EM вы полняется до сходимости, но как нам определить, что сходимость наступила?. Мы можем останавливаться, когда либо <tex>Q(\Theta)</tex>, либо <tex>H</tex> перестают сильно меняться. Но, обычно, удобней контролировать изменения значений скрытых переменных, так как они имеют смысл вероятностей и принимают значения из отрезка <tex>[0,1]</tex>. Поэтому один из возможных критериев остановки будет выглядеть так: <tex>max_{i,j} |h_{ij} - h_{ij}^{(0)}| > \delta</tex> | ||
=== Псевдокод === | === Псевдокод === | ||
Строка 125: | Строка 147: | ||
== Использование в задаче кластеризации == | == Использование в задаче кластеризации == | ||
+ | |||
+ | [[Файл:kmeans.jpg|right|thumb|200px|Пример работы k-means]] | ||
Как уже упоминалось в [[#Опредиление|Определении]], алгоритм EM подходит для решения задачи кластеризации. И одной из его имплементаций для это задачи является алгоритм <tex>k</tex>-means. В этом алгоритме в качестве скрытых переменных выступают метки классов объектов. Параметрами же являются центроиды искомых классов. Тогда на шаге E мы относим объекты к какому то одному классу на основе расстояний до центроид. А на шаге M мы пересчитываем центроиды кластеров, исходя из полученной на шаге E разметке.<br/> | Как уже упоминалось в [[#Опредиление|Определении]], алгоритм EM подходит для решения задачи кластеризации. И одной из его имплементаций для это задачи является алгоритм <tex>k</tex>-means. В этом алгоритме в качестве скрытых переменных выступают метки классов объектов. Параметрами же являются центроиды искомых классов. Тогда на шаге E мы относим объекты к какому то одному классу на основе расстояний до центроид. А на шаге M мы пересчитываем центроиды кластеров, исходя из полученной на шаге E разметке.<br/> | ||
Строка 130: | Строка 154: | ||
Также стоит упомянуть алгоритм <tex>c</tex>-means. В нем качестве скрытых переменных выступают вероятности принадлежности объекта к классам. На шаге E мы пересчитывем вероятности принадлежности объектов, иходя из расстояния до центроид. Шаг M, идейно, остается без изменений. | Также стоит упомянуть алгоритм <tex>c</tex>-means. В нем качестве скрытых переменных выступают вероятности принадлежности объекта к классам. На шаге E мы пересчитывем вероятности принадлежности объектов, иходя из расстояния до центроид. Шаг M, идейно, остается без изменений. | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
== Реализация на python == | == Реализация на python == |
Версия 14:36, 17 марта 2020
Содержание
Определение
Алгоритм EM (англ: expectation-maximization) --- итеративный алгоритм поиска оценок максимума правдоподобия модели, в ситуации, когда она зависит от скрытых(ненаблюдаемых) переменных.
Алгоритм ищет параметры модели итеративно, каждая итерация состоит из двух шагов:
E(Expectation) шаг --- поиск наиболее вероятных значений скрытых переменных.
M(Maximisation) шаг --- поиск наиболее вероятных значений параметров, для полученных на шаге E значений скрытых переменных.
EM алгоритм подходит для решения задач двух типов:
- Задачи с неполными данными.
- Задачи, в которых удобно вводить скрытые переменные для упрощения подсчета функции правдоподобия. Примером такой задачи может служить кластеризация
Основной алгоритм
Постановка задачи
Плотность распределения смеси имеет вид:
Где - функция правдоподобия -ой компонеты смеси, - априорная вероятность -ой компоненты распределения.
Перед нами стоит две задачи:
- По заданной выборке случайных и независимых наблюдений полученных из смеси , числу и функцию , оценить вектор параметров
- Найти
Проблема
Задачи подобного рода мы умеем решать максимизируя логармиф правдоподобия:
Но пробелма в том, что мы не знаем как аналитически посчитать логарифм суммы. Тут нам и поможет алгоритм EM.
Решение
Основная идея алгоритма EM заключается в том, что мы добавляме скрытые переменные такие, что:
- Они могут быть выражены через
- Они помогают разбить сумму так: , где - матрица скрытых переменных.
Тогда алгоритм EM сводится к повторению шагов, указанных в Определении.
E-шаг
Скрытые переменные представляют из себя матрицу
где - вероятность того, что пренадлежит -ой компоненте.
По формуле Байеса справедливо равенство:
Также
Таким образом, зная значения вектора параметров
M-шаг
Теорема: |
Если известны скрытые переменные, то задача минимизации сводится к независимым подзадачам:Оптимальные же веса считаются как: |
Доказательство: |
Посчитаем логарифм правдоподобия:
Приравняв к нулю лагранжиан по |
Критерий остановки
Алгоритм EM вы полняется до сходимости, но как нам определить, что сходимость наступила?. Мы можем останавливаться, когда либо
, либо перестают сильно меняться. Но, обычно, удобней контролировать изменения значений скрытых переменных, так как они имеют смысл вероятностей и принимают значения из отрезка . Поэтому один из возможных критериев остановки будет выглядеть так:Псевдокод
Input:Repeat E-step: for all i = 1..m; j = 1..k: M-step: for all j = 1..k: Until stopping criteria is satisfied
Плюсы и минусы
Плюсы:
- Сходится в большинтсве ситуаций
- Наиболее гибкое решение
- Легко может добавить нечуствительность к шуму
Минусы:
- Чуствителен к начальному приближению. Могут быть ситуации, когда сойдемся к локальному экстремуму
- Число компонент является гиперпараметром.
Модификации
Базовый алгоритм EM является очень гибким для модификаций, позволяющих улучшить его работу. В этом разделе мы приведем краткое описаниен некоторых из них.
Generalized EM-algorithm
Осоновная идея этой модификации заключается в том, что на шаге M мы не будем пытаться найти наилучшее решение. Это применимо в случаях, когда максимизация
является сликшом дорогой, поэтому нам достаточно сделать лишь несколько итераций, для того, чтобы сместиться в сторону максимума значения . Эта модификация имеет неплохую сходимость.Stochastic EM-algorithm
Как уже было отмечено в Плюсы и минусы, базовый алгоритм чувствителен к начальному приближению и могут быть ситуации, когда алгоритм "застрянет" в лоакльном экстремуме. Для того, чтобы предотвратить это, будем на каждой итерации алгоритма случайно "встряхивать" выборку. В этой модификации у нас добавляется шаг S, на котором мы и будем "встряхивать" выборку. И на шаге M мы будем решать уже задачу максимуму невзвешенного правдоподобия. Эта модификация хороша тем, что нечуствиетльная к начальном приблежению.
Пример. Разделение смеси Гауссиана
Каноническим примером использования EM алгоритма является задача разделения смеси гауссиана. Данные у нас получены из нормального распределения. В этом случае параметрами функций ялвяются матожидание и дисперсия.
- плотность распределения
Посчитаем значения для каждого шага.
E-шаг:
M-шаг:
Использование в задаче кластеризации
Как уже упоминалось в Определении, алгоритм EM подходит для решения задачи кластеризации. И одной из его имплементаций для это задачи является алгоритм -means. В этом алгоритме в качестве скрытых переменных выступают метки классов объектов. Параметрами же являются центроиды искомых классов. Тогда на шаге E мы относим объекты к какому то одному классу на основе расстояний до центроид. А на шаге M мы пересчитываем центроиды кластеров, исходя из полученной на шаге E разметке.
Также стоит упомянуть алгоритм
-means. В нем качестве скрытых переменных выступают вероятности принадлежности объекта к классам. На шаге E мы пересчитывем вероятности принадлежности объектов, иходя из расстояния до центроид. Шаг M, идейно, остается без изменений.
Реализация на python
import numpy as np import matplotlib.pyplot as plt from sklearn import cluster, datasets, mixture from sklearn.preprocessing import StandardScaler from itertools import cycle, islice np.random.seed(12) # Создаем datasets с использованием стандартных sklearn.datasets n_samples = 2000 random_state = 170 noisy_circles = datasets.make_circles(n_samples=n_samples, factor=.5, noise=.05) noisy_moons = datasets.make_moons(n_samples=n_samples, noise=.05) blobs = datasets.make_blobs(n_samples=n_samples, random_state=8) varied = datasets.make_blobs(n_samples=n_samples, cluster_std=[1.0, 2.5, 0.5], random_state=random_state) # Создаем анизатропно разделенные данные X, y = datasets.make_blobs(n_samples=n_samples, random_state=random_state) transformation = [[0.6, -0.6], [-0.4, 0.8]] X_aniso = np.dot(X, transformation) aniso = (X_aniso, y) # Выставляем параметры для matplotlib.pyplot plt.figure(figsize=(9 * 2 + 3, 12.5)) plt.subplots_adjust(left=.02, right=.98, bottom=.001, top=.96, wspace=.05, hspace=.01) plot_num = 1 defaul_n = 3 # Варьируем значение количества классов в зависимости от данных, ведь для нас это гиперпараметр datasets = [ (varied, defaul_n), (aniso, defaul_n), (blobs, defaul_n), (noisy_circles, 2)] for i_dataset, (dataset, n_cluster) in enumerate(datasets): X, y = dataset # Нормализация данных X = StandardScaler().fit_transform(X) # Непосредственно наш алгоритм - Gaussian Mixture gmm = mixture.GaussianMixture(n_components=n_cluster, covariance_type='full') # Для сравнения берем алгоритм - K-means two_means = cluster.KMeans(n_clusters=n_cluster) clustering_algorithms = ( ('GaussianMixture', gmm), ('KMeans', two_means) ) for name, algorithm in clustering_algorithms: # Этап обучения algorithm.fit(X) # Применяем алгоритм y_pred = algorithm.predict(X) # Рисуем результаты plt.subplot(len(datasets), len(clustering_algorithms), plot_num) if i_dataset == 0: plt.title(name, size=18) colors = np.array(list(islice(cycle(['#377eb8', '#ff7f00', '#4daf4a']), int(max(y_pred) + 1)))) plt.scatter(X[:, 0], X[:, 1], s=10, color=colors[y_pred]) plt.xlim(-2.5, 2.5) plt.ylim(-2.5, 2.5) plt.xticks(()) plt.yticks(()) plot_num += 1 plt.show()
Как и следовало ожидать, алгоритм работает на некоторых данных лучше чем k-means, однако есть данные, с которыми он не справляется без дополнительных преобразований.