Algoritmo de agrupamento de modelos de mistura gaussiana explicado

Cory Maklin Segue 15 de jul · 8 min ler

Os modelos de mistura gaussiana podem ser usados para agrupar dados não rotulados da mesma maneira que k-means. Há, no entanto, algumas vantagens em usar modelos de mistura gaussiana sobre k-means.

Em primeiro lugar, k-means não considera a variação. Por divergência, estamos nos referindo à largura da curva da forma da campainha.

Comparação de duas distribuições normais com diferentes variâncias

Em duas dimensões, a variância (covariância para ser exata) determina a forma da distribuição.

Uma maneira de pensar sobre o modelo de k- mean é que ele coloca um círculo (ou, em dimensões mais altas, uma hiperesfera) no centro de cada cluster, com um raio definido pelo ponto mais distante do cluster.

Isso funciona bem para quando seus dados são circulares. No entanto, quando seus dados assumem uma forma diferente, você acaba com algo assim.

Em contraste, os modelos de mistura gaussiana podem lidar com clusters mesmo muito oblongos.

A segunda diferença entre os modelos de k-médias e de mistura de Gauss é que o primeiro executa uma classificação difícil, enquanto o segundo executa uma classificação suave. Em outras palavras, k-means nos diz qual ponto de dados pertence a qual cluster, mas não nos fornecerá as probabilidades de que um determinado ponto de dados pertence a cada um dos possíveis clusters.

Ao chamar a função predict , o modelo atribuirá todos os pontos de dados a um dos clusters.

 gmm.predict (X) 

Por outro lado, podemos chamar a função predict_proba para retornar as probabilidades de que um ponto de dados pertence a cada um dos clusters de K.

 gmm.predict_proba (X) 

Modelos de mistura gaussiana em um relance

Como o nome indica, um modelo de mistura gaussiana envolve a mistura (ou seja, superposição) de múltiplas distribuições gaussianas. Por uma questão de explicação, suponha que tivéssemos três distribuições compostas de amostras de três classes distintas.

O gaussiano azul representa o nível de educação das pessoas que compõem a classe baixa. O gaussiano vermelho representa o nível de educação das pessoas que compõem a classe média, e o verde gaussiano representa o nível de educação das pessoas que compõem a classe alta.

Não sabendo quais amostras vieram de qual classe, nosso objetivo será usar Gaussian Mixture Models para atribuir os pontos de dados ao cluster apropriado.

Depois de treinar o modelo, nós idealmente acabamos com três distribuições no mesmo eixo. Então, dependendo do nível de educação de uma determinada amostra (onde ela está localizada no eixo), colocamos em uma das três categorias.

Cada distribuição é multiplicada por um peso ? para explicar o fato de que não temos um número igual de amostras de cada categoria. Em outras palavras, poderíamos incluir apenas 1000 pessoas da classe alta e 100.000 pessoas da classe média.

Como estamos lidando com probabilidades, os pesos devem ser adicionados a 1, quando somados.

Se decidirmos adicionar outra dimensão, como o número de filhos, pode ser algo assim.

Algoritmo do Modelo de Mistura Gaussiana

Para aqueles de vocês que não são matematicamente inclinados, peço desculpas antecipadamente como a próxima seção é bastante pesada.

Vamos supor que nós quiséssemos saber qual é a probabilidade de que a amostra do ith tenha vindo do k de Gauss . Podemos expressar isso como:

Onde theta representa a média, covariância e peso para cada gaussiano.

Você também pode se deparar com a equação escrita como ?. Isso não deve ser confundido com o peso associado a cada Gaussiano (confuso eu sei).

Em seguida, expressamos a probabilidade de observar um ponto de dados, dado que veio de Gaussian K como:

Este último é às vezes escrito como segue (Eu acredito que o N vem de Distribuição N ormal):

Suponhamos que tivéssemos uma distribuição gaussiana em que o eixo horizontal é a pontuação de QI diferente que um indivíduo poderia obter, do mais baixo ao mais alto. Podemos descobrir a probabilidade de um indivíduo ter um QI de 120, desenhando uma linha vertical da posição ao longo do eixo x até a curva e, em seguida, observando o valor correspondente no eixo y. O valor de y em qualquer ponto é igual à equação acima.

Se gostaria de saber a probabilidade de observar a amostra i, tendo em conta todas as diferentes distribuições, nós simplesmente somar as probabilidades de observar a amostra, dado que se tratava de cada um dos possíveis Gaussian.

Dito de forma diferente, pegamos uma amostra (linha) do nosso conjunto de dados, observamos uma única característica (ou seja, nível de educação), plotamos sua posição no eixo x e somamos os valores y correspondentes (verossimilhança) para cada distribuição.

Para estender isso para todas as amostras em nosso conjunto de dados. Assumimos que a probabilidade de observar uma amostra é independente de todas as outras e, em seguida, podemos simplesmente multiplicá-las.

Podemos reescrever a equação usando a nomenclatura que vimos anteriormente da seguinte forma:

Frequentemente, tomamos o log da probabilidade porque a multiplicação de dois números dentro de um log é igual à soma dos logs de seus constituintes, e é mais fácil adicionar números do que multiplicá-los.

Algoritmo de Maximização de Expectativas (EM)

Ainda precisamos abordar o fato de que precisamos dos parâmetros de cada Gaussiano (ou seja, variância, média e peso) para agrupar nossos dados, mas precisamos saber qual amostra pertence ao que Gaussian para estimar esses mesmos parâmetros.

Isto é onde e xpectation maximização vem para jogar. Em um nível alto, o algoritmo de maximização de expectativa pode ser descrito da seguinte maneira:

  1. Comece com parâmetros aleatórios de Gauss (?)
  2. Repita o seguinte até convergirmos:

a) Passo da Expectativa : Calcule p (zi = k | xi, ?). Em outras palavras, se provar que eu pareço com ele veio de agrupamento k?

b) Passo de maximização : atualize os parâmetros gaussianos (?) para ajustar pontos atribuídos a eles.

Etapa de maximização

Na etapa de maximização, queremos maximizar a probabilidade de que cada amostra tenha vindo da distribuição. Lembre-se de que a probabilidade é a altura da curva em um ponto ao longo do eixo x. Portanto, queremos modificar a variância e a média da distribuição de forma que a altura da plotagem em cada ponto de dados seja maximizada.

Isso levanta a questão: "Como devemos proceder para selecionar os valores ideais para a variância e a média". Usando a forma geral de maximização de expectativa , podemos derivar um conjunto de equações para a média, variância e peso.

Podemos seguir o mesmo processo para obter as equações para a covariância e peso.

Uma vez que temos as equações, simplesmente as aplicamos durante a etapa de maximização. Ou seja, plug-in nos números de cada equação para determinar a melhor média, covariância, peso e, em seguida, definir os parâmetros de Gauss em conformidade.

Vamos dar uma olhada na matemática em ação. Inicialmente, não sabemos quais pontos estão associados a qual distribuição.

Começamos com K Gaussians (neste caso, K = 2) com média aleatória, variância e peso.

Então, repetimos as etapas de expectativa e maximização até que haja pouca ou nenhuma mudança em theta (?).

Vale a pena notar que o algoritmo é suscetível aos máximos locais.

Código

Agora, que temos uma noção de como os modelos de mistura gaussiana funcionam, vamos dar uma olhada em como poderíamos implementá-los. Para começar, importe as seguintes bibliotecas.

 import numpy como np 
de sklearn.datasets.samples_generator import make_blobs
de sklearn.mixture import GaussianMixture
de pyplot de importação matplotlib como plt
importar no mar como sns
sns.set ()

Nós geramos aleatoriamente 4 clusters.

 X, y = make_blobs (n_samples = 300, centros = 4, cluster_std = 0,60, random_state = 0) 
plt.scatter (X [: 0], X [: 1])

O número ideal de clusters (K) é o valor que minimiza o critério de informação de Akaike (AIC) ou o critério de informação bayesiano (BIC) .

 n_components = np.arange (1, 21) 
models = [GaussianMixture (n, covariance_type = 'full', random_state = 0) .fit (X) para n em n_components]
plt.plot (ncomponents, [m.bic (X) para m em models], label = 'BIC ')
plt.plot (n_components, [m.aic (X) para m em modelos], label = 'AIC')
plt.legend (loc = 'melhor')
plt.xlabel ('n_components');

Nós treinamos nosso modelo usando o número ideal de clusters (neste caso, 4).

 gmm = GaussianMixture (ncomponents = 4) gmm.fit (X) 

Usamos o método de predict para obter uma lista de pontos e seus respectivos clusters.

 labels = gmm.predict (X) plt.scatter (X [:, 0], X [:, 1], c = rótulos, cmap = 'viridis'); 

Pensamentos finais

Ao contrário de k-médias, os modelos de mistura gaussiana são responsáveis pela variação e retornam a probabilidade de que um ponto de dados pertença a cada um dos clusters de K.

Texto original em inglês.