Смешанная модель Гаусса (GMM) — это вероятностная модель, которая предполагает, что экземпляры были сгенерированы из смеси нескольких распределений Гаусса, параметры которых неизвестны. Все экземпляры, сгенерированные из одного распределения Гаусса, образуют кластер, который обычно выглядит как эллипсоид. Когда вы наблюдаете экземпляр, вы знаете, что он был сгенерирован из одного из распределений Гаусса, но вам не говорят, какое именно, и вы не знаете, каковы параметры этих распределений.

Существует несколько вариантов ОММ: в самом простом варианте, реализованном в классе GaussianMixture, необходимо заранее знать количество k распределений Гаусса. Предполагается, что набор данных X был сгенерирован с помощью следующего вероятностного процесса:

  • Для каждого экземпляра случайным образом выбирается кластер из k кластеров. Вероятность выбора j-го кластера определяется весом кластера ϕ(j). Индекс кластера, выбранного для i-го экземпляра, обозначается z(i).
  • Если z(i)=j, что означает, что i-й экземпляр был назначен j-му кластеру, местоположение x(i) этого экземпляра выбирается случайным образом из распределения Гаусса со средним значением µ(j) и ковариационной матрицей Σ(j).

Этот порождающий процесс можно представить в виде графической модели (см. рисунок). Это график, представляющий структуру условных зависимостей между случайными величинами.

Вот как это интерпретировать:

-> Кружки представляют собой случайные величины.

-> Квадраты представляют собой фиксированные значения (т. е. параметры модели).

-› Большие прямоугольники называются пластинами: они указывают на то, что их содержимое повторяется несколько раз.

-› Число, указанное в нижней правой части каждой пластины, указывает, сколько раз повторяется ее содержимое, поэтому имеется m случайных величин z(i) (от z(1) до z(m)) и m случайных величин x (i), а k означает µ(j) и k ковариационных матриц Σ(j), но только один весовой вектор ϕ (содержащий все веса от ϕ(1) до ϕ(k)).

-› Каждая переменная z(i) берется из категориального распределения с весами ϕ. Каждая переменная x(i) берется из нормального распределения со средним значением и ковариационной матрицей, определяемой ее кластером z(i).

-> Сплошные стрелки обозначают условные зависимости. Например, распределение вероятностей для каждой случайной величины z(i) зависит от вектора весов ϕ. Обратите внимание, что когда стрелка пересекает границу пластины, это означает, что она применяется ко всем повторениям этой пластины, поэтому, например, вектор весов ϕ обуславливает распределения вероятностей всех случайных величин от x(1) до x(m).

-> Волнистая стрелка от z(i) до x(i) представляет собой переключатель: в зависимости от значения z(i) экземпляр x(i) будет выбран из другого распределения Гаусса. Например,

-> Заштрихованные узлы указывают на то, что значение известно, поэтому в этом случае только случайные величины x(i) имеют известные значения: они называются наблюдаемыми переменными. Неизвестные случайные величины z(i) называются скрытыми переменными.

-› Так что же можно сделать с такой моделью? Что ж, учитывая набор данных X, вы обычно хотите начать с оценки весов ϕ и всех параметров распределения от μ (1) до μ (k) и от Σ (1) до Σ (k). Класс GaussianMixture от Scikit-Learn делает это тривиальным:

from sklearn.mixture import GaussianMixture
gm = GaussianMixture(n_components=3, n_init=10)gm.fit(X)
#Let’s look at the parameters that the algorithm estimated:
gm.weights_array([0.20965228, 0.4000662 , 0.39028152])
gm.means_array([[ 3.39909717, 1.05933727], [-1.40763984, 1.42710194], [ 0.05135313, 0.07524095]])
gm.covariances_array([[[ 1.14807234, -0.03270354], [-0.03270354, 0.95496237]], [[ 0.63478101, 0.72969804], [ 0.72969804, 1.1609872 ]], [[ 0.68809572, 0.79608475], [ 0.79608475, 1.21234145]]])

Отлично, все заработало! Действительно, веса, которые использовались для генерации данных, составляли 0,2, 0,4 и 0,4, и аналогичным образом средние и ковариационные матрицы были очень близки к найденным алгоритмом. Но как? Этот класс основан на алгоритме максимизации ожидания (EM), который во многом похож на алгоритм K-средних: он также случайным образом инициализирует параметры кластера, затем повторяет два шага до сходимости, сначала назначая экземпляры кластерам (это называется этапом ожидания). затем обновление кластеров (это называется шагом максимизации). Звучит знакомо? Действительно, в контексте кластеризации вы можете думать об EM как об обобщении K-средних, которое не только находит центры кластеров (от μ(1) до μ(k)), но также их размер, форму и ориентацию (от Σ(1) до μ(k)). Σ(k)), а также их относительные веса (от ϕ(1) до ϕ(k)). В отличие от KMeans, EM использует мягкое назначение кластера, а не жесткое: для каждого экземпляра на этапе ожидания алгоритм оценивает вероятность того, что он принадлежит каждому кластеру (на основе текущих параметров кластера). Затем, на этапе максимизации
, каждый кластер обновляется с использованием всех экземпляров в наборе данных, при этом каждый экземпляр взвешивается по расчетной вероятности того, что он принадлежит этому кластеру. Эти вероятности называются ответственностью кластеров за экземпляры. На этапе максимизации на обновление каждого кластера в основном будут влиять экземпляры, за которые он несет наибольшую ответственность.

К сожалению, как и K-Means, EM может в конечном итоге прийти к
плохим решениям, поэтому его нужно запускать несколько раз, оставляя только
лучшее решение. Вот почему мы установили для n_init значение 10. Будьте осторожны: по умолчанию
n_init установлено только на 1.

Вы можете проверить, сошелся ли алгоритм и сколько итераций потребовалось:

gm.converged_True
gm.n_iter_3

Хорошо, теперь, когда у вас есть оценка местоположения, размера, формы, ориентации и относительного веса каждого кластера, модель может легко отнести каждый экземпляр к наиболее вероятному кластеру (жесткая кластеризация) или оценить вероятность того, что он принадлежит к определенному кластеру. кластер (мягкая кластеризация). Для этого просто используйте метод predict() для жесткой кластеризации или метод predict_proba() для мягкой кластеризации.

gm.predict(X)array([2, 2, 1, ..., 0, 0, 0])
gm.predict_proba(X)array([[2.32389467e-02, 6.77397850e-07, 9.76760376e-01], [1.64685609e-02, 6.75361303e-04, 9.82856078e-01], [2.01535333e-06, 9.99923053e-01, 7.49319577e-05], ..., [9.99999571e-01, 2.13946075e-26, 4.28788333e-07], [1.00000000e+00, 1.46454409e-41, 5.12459171e-16], [1.00000000e+00, 8.02006365e-41, 2.27626238e-15]])

Это генеративная модель, то есть вы действительно можете выбирать из нее новые экземпляры (обратите внимание, что они упорядочены по индексу кластера):

X_new, y_new = gm.sample(6) 
X_newarray([[ 2.95400315, 2.63680992], [-1.16654575, 1.62792705], [-1.39477712, -1.48511338], [ 0.27221525, 0.690366 ], [ 0.54095936, 0.48591934], [ 0.38064009, -0.56240465]]) 
y_newarray([0, 1, 2, 2, 2, 2])

Также можно оценить плотность модели в любом заданном месте. Это достигается с помощью метода score_samples(): для каждого заданного экземпляра этот метод оценивает логарифм функции плотности вероятности (PDF) в этом месте. Чем больше оценка, тем выше плотность:

gm.score_samples(X)array([-2.60782346, -3.57106041, -3.33003479, ..., -3.51352783, -4.39802535, -3.80743859])

Если вы вычислите экспоненту этих оценок, вы получите значение PDF в месте расположения заданных экземпляров. Это не вероятности, а плотности вероятности: они могут принимать любое положительное значение, а не только от 0 до 1. Чтобы оценить вероятность того, что экземпляр попадет в конкретную область, вам придется интегрировать PDF по этой области (если вы делаете это для всего пространства возможных местоположений экземпляров, результат будет 1).

Хороший! Алгоритм явно нашел отличное решение. Конечно, мы упростили его задачу, фактически сгенерировав данные, используя набор двумерных распределений Гаусса (к сожалению, реальные данные не всегда такие гауссовские и низкоразмерные), а также дали алгоритму правильное количество кластеров. Когда есть много измерений, или много кластеров, или мало экземпляров, EM может изо всех сил пытаться сходиться к оптимальному решению. Возможно, вам придется уменьшить сложность задачи, ограничив количество параметров, которые должен изучить алгоритм: один из способов сделать это, чтобы ограничить диапазон форм и ориентаций, которые могут иметь кластеры. Этого можно достичь, наложив ограничения на ковариационные матрицы. Для этого просто установите гиперпараметр covariance_type в одно из следующих значений:

-› «сферический»: все кластеры должны быть сферическими, но могут иметь разный диаметр (т. е. разную дисперсию).

-› «diag»: кластеры могут принимать любую эллипсоидальную форму любого размера, но оси эллипсоида должны быть параллельны осям координат (т. е. ковариационные матрицы должны быть диагональными).

-› «связанный»: все кластеры должны иметь одинаковую эллипсоидальную форму, размер и ориентацию (т. е. все кластеры имеют одну и ту же ковариационную матрицу).

-› По умолчанию covariance_type равен «полный», что означает, что каждый кластер может принимать любую форму, размер и ориентацию (у него есть своя неограниченная ковариационная матрица). На рисунке показаны решения, найденные алгоритмом EM, когда для параметра covariance_type установлено значение «привязанный» или «сферический».

Вычислительная сложность обучения модели GaussianMixture зависит от количества экземпляров m, количества измерений n, количества кластеров k и ограничений на ковариационные матрицы. Если covariance_type является «сферическим» или «diag», это O (kmn), при условии, что данные имеют структуру кластеризации. Если covariance_type имеет значение «связанный» или «полный», оно равно O(kmn2 + kn3), поэтому масштабирование для большого количества объектов недопустимо.