Модель гауссовой смеси - это форма оценки плотности, которая дает приближение плотности вероятности для наших данных. Модели гауссовой смеси наиболее подходят, когда наши данные являются многомодальными. На приведенном выше графике плотности вероятности вы можете увидеть 3 выпуклости, образованные 3 начальными распределениями Гаусса, которые можно реализовать как сумму взвешенных гауссовских распределений.

Согласно приведенному выше уравнению все распределение зависит от веса каждого гауссовского pi (k). сумма всех значений pi должна быть равна 1. Вместо использования pi для веса мы можем использовать скрытую переменную (Z), поскольку сумма всех значений pi равна 1, что можно обозначить как P (Z = k) = pi (k).

Теперь посмотрим, как мы можем построить и обучить модель гауссовой смеси. В таких алгоритмах, как K означает кластеризацию, он определяет принадлежность точки данных, просто сравнивая расстояния до каждого центра кластера, но это может вызвать ошибки в модели. в следующем примере, как K означает, что может потерпеть неудачу (я предполагаю, что у вас есть немного знаний о Hard k означает кластеризацию).

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

Для каждого распределения мы рассчитываем обязанности, как в приведенном выше уравнении. мы вычисляем вес конкретной оценки плотности по Гауссу и получаем среднее значение по всем оценкам плотности, но кроме pi, вам необходимо вычислить еще 2 параметра. Ковариационная матрица и среднее каждого распределения. Давайте посмотрим, как рассчитать вышеуказанные 2 параметра.

Матрица ответственности (R) имеет форму (N, K), где N - количество точек данных, а K - количество гауссовых распределений в модели. Матрица среднего распределения (Mu) имеет форму (K, f), где f - количество функций в точках данных. Ковариационная матрица (Cov) имеет форму (K, f, f), а начальное распределение pi имеет форму вектора длины K.

Итак, после вычисления всех этих значений была завершена 1 итерация. Так что повторяйте процесс для определенных эпох, пока стоимость не сойдется. Функция затрат рассчитывается путем суммирования значений журнала матрицы ответственности.

Теперь давайте рассмотрим, как мы можем кодировать простую модель гауссовой смеси на наших собственных данных.

Давайте построим модель

Для этого примера кода я только что создал 1200 точек с точными двумя характеристиками из-за целей визуализации. Этот мультимодальный режим содержит 4 гауссовских распределения, и с помощью значения m вы можете сместить 4 распределения по своему усмотрению. в данном случае я просто использовал m = 4. После создания данных мы можем построить их график, и вы увидите рис 6, на котором показано распределение данных.

import numpy as np
import matplotlib.pyplot as plt
from sklearn.utils import shuffle
from scipy.stats import multivariate_normal
class GaussianMixtureModels(object):
   def __init__(self,K):
      self.f = 2    # no: of features
      self.N = 1200 # dataset size
      self.K = K    # cluster centers
      self.minimal_cost_difference = 0.1
      self.smoothing = 1e-2
 
   def create_data(self, m):
      X = np.zeros((self.N, self.f))
      mu1 = np.array([0,0])
      mu2 = np.array([m,m])
      mu3 = np.array([m,0])
      mu4 = np.array([0,m])
      X[:300,] = np.random.randn(300,self.f) + mu1
      X[300:600,] = np.random.randn(300,self.f) + mu2
      X[600:900,] = np.random.randn(300,self.f) + mu3
      X[900:1200,] = np.random.randn(300,self.f) + mu4
      plt.scatter(X[:,0],X[:,1])
      plt.title('before_apply_GMM')
      plt.savefig('before_apply_GMM.png')
      plt.show()
      self.X = X

В качестве первого шага необходимо инициализировать все параметры (Среднее, Ковариантность, Пи). Из всех 1200 точек данных случайным образом выбираем K наборов точек и назначаем их как средние значения, а затем аналогичным образом назначаем инициализирующую матрицу ковариации, но вместо случайных точек мы просто инициализируем ее в единичную матрицу. Начальное распределение веса pi инициализируется с равномерной вероятностью 1 / K.

def initialize_param(self):
     Mu = np.zeros((self.K, self.f))
     Cov = np.zeros((self.K, self.f, self.f))
     for k in range(self.K):
         idx = np.random.choice(self.N)
         Mu[k] = self.X[idx]
         Cov[k] = np.eye(self.f)
         
     self.Mu = Mu
     self.Cov = Cov
     self.pi = np.ones(self.K)/self.K

Следующим образом вы можете рассчитать матрицу затрат и ответственности за одну итерацию.

R = np.zeros((self.N, self.K))
for k in range(self.K):
    for n in range(self.N):
      R[n,k] = self.pi[k] * multivariate_normal.pdf(self.X[n],
                                           self.Mu[k], self.Cov[k])
cost = np.log(R.sum(axis=1)).sum()
R = R / R.sum(axis=1, keepdims=True)
self.R = R

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

for k in range(self.K):
     Nk = self.R[:,k].sum()
     self.pi[k] = Nk / self.N
     Mu_k = self.R[:,k].dot(self.X)/Nk
     self.Mu[k] = Mu_k
     delta = self.X - Mu_k 
     Rdelta = np.expand_dims(self.R[:,k], -1) * delta
     self.Cov[k] = Rdelta.T.dot(delta) / 
                                  Nk + np.eye(self.f)*self.smoothing

Теперь давайте посмотрим на результаты и визуализацию для нескольких значений K. Я просто использовал пять значений K (здесь мы знаем, что фактические значения K равны 4, потому что мы только что создали наши собственные данные, но в реальных наборах данных вам нужно проверить несколько значений K и найти оптимальное).

Вы можете видеть, что когда K = 4, вы можете получить наиболее точную модель при сравнении представленных выше визуализаций. Таким образом, вы можете построить модель гауссовой смеси, но в этом типе моделей есть ограничения. Давайте обсудим, что это за ограничения.

Первое ограничение - значение K. В более сложном наборе данных вам просто нужно попробовать много значений K, потому что мы не можем просто уловить шаблон данных.

И следующая - проблема сингулярной ковариации. Иногда ваши данные могут быть все ближе и ближе. тогда матрица согласия приближается к нулю, а обратная ковариация приближается к бесконечности.

Вот базовое определение модели гауссовой смеси, и вы можете найти код в моей ссылке на github в разделе Модели гауссовой смеси.

Спасибо !!!