Como ajustar o modelo de mistura para agrupamento

15

Eu tenho duas variáveis ​​- X e Y e preciso tornar o cluster máximo (e ideal) = 5. Vamos traçar o gráfico ideal de variáveis ​​como a seguir:

insira a descrição da imagem aqui

Eu gostaria de fazer 5 grupos disso. Algo assim:

insira a descrição da imagem aqui

Então eu acho que esse é um modelo de mistura com 5 clusters. Cada cluster tem um ponto central e um círculo de confiança ao seu redor.

Os clusters nem sempre são bonitos assim, eles se parecem com os seguintes, onde em algum momento dois clusters estão próximos ou um ou dois clusters estão completamente ausentes.

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Como encaixar o modelo de mistura e executar a classificação (agrupamento) nessa situação efetivamente?

Exemplo:

set.seed(1234)
X <- c(rnorm(200, 10, 3), rnorm(200, 25,3),
        rnorm(200,35,3), rnorm(200,65, 3), rnorm(200,80,5))
Y <- c(rnorm(1000, 30, 2))
plot(X,Y, ylim = c(10, 60), pch = 19, col = "gray40")
rdorlearn
fonte

Respostas:

13

Aqui está o script para usar o modelo de mistura usando o mcluster.

X <- c(rnorm(200, 10, 3), rnorm(200, 25,3), rnorm(200,35,3), rnorm(200,65, 3), rnorm(200,80,5))
Y <- c(rnorm(1000, 30, 2))
plot(X,Y, ylim = c(10, 60), pch = 19, col = "gray40")

require(mclust)
xyMclust <- Mclust(data.frame (X,Y))
plot(xyMclust)

insira a descrição da imagem aqui insira a descrição da imagem aqui

Em uma situação em que há menos de 5 clusters:

X1 <- c(rnorm(200, 10, 3), rnorm(200, 25,3), rnorm(200,35,3),  rnorm(200,80,5))
Y1 <- c(rnorm(800, 30, 2))
xyMclust <- Mclust(data.frame (X1,Y1))
plot(xyMclust)

insira a descrição da imagem aqui

 xyMclust4 <- Mclust(data.frame (X1,Y1), G=3)
plot(xyMclust4)

insira a descrição da imagem aqui

Neste caso, estamos montando 3 clusters. E se encaixarmos 5 clusters?

xyMclust4 <- Mclust(data.frame (X1,Y1), G=5)
plot(xyMclust4)

Pode forçar a fazer 5 clusters.

insira a descrição da imagem aqui

Também vamos apresentar algum ruído aleatório:

X2 <- c(rnorm(200, 10, 3), rnorm(200, 25,3), rnorm(200,35,3),  rnorm(200,80,5), runif(50,1,100 ))
Y2 <- c(rnorm(850, 30, 2))
xyMclust1 <- Mclust(data.frame (X2,Y2))
plot(xyMclust1)

mclustpermite agrupamento baseado em modelo com ruído, ou seja, observações externas que não pertencem a nenhum cluster. mclustpermite especificar uma distribuição anterior para regularizar o ajuste aos dados. Uma função priorControlé fornecida no mclust para especificar o prior e seus parâmetros. Quando chamado com seus padrões, ele invoca outra função chamada defaultPriorque pode servir como um modelo para especificar priors alternativos. Para incluir ruído na modelagem, uma estimativa inicial das observações de ruído deve ser fornecida por meio do componente de ruído do argumento de inicialização em Mclustou mclustBIC.

insira a descrição da imagem aqui

A outra alternativa seria usar o mixtools pacote que permite especificar média e sigma para cada componente.

X2 <- c(rnorm(200, 10, 3), rnorm(200, 25,3), rnorm(200,35,3),
    rnorm(200,80,5), rpois(50,30))
Y2 <- c(rnorm(800, 30, 2), rpois(50,30))
df <- cbind (X2, Y2)
require(mixtools)
out <- mvnormalmixEM(df, lambda = NULL, mu = NULL, sigma = NULL,
   k = 5,arbmean = TRUE, arbvar = TRUE, epsilon = 1e-08,  maxit = 10000, verb = FALSE)
plot(out, density = TRUE, alpha = c(0.01, 0.05, 0.10, 0.12, 0.15),  marginal = TRUE)

insira a descrição da imagem aqui

John
fonte
2
+1 Esta resposta é muito útil, utilizável e sucinta, e um exemplo perfeito de como é fácil demais fazer coisas como essa em R sem nem mesmo saber a matemática por trás dela ...
Paul
3

Uma abordagem padrão é o Gaussian Mixture Models, que é treinado por meio do algoritmo EM. Mas como você também percebe que o número de clusters pode variar, considere também um modelo não paramétrico como o Dirichlet GMM, que também é implementado no scikit-learn.

No R, esses dois pacotes parecem oferecer o que você precisa,

jpmuc
fonte