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")

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


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.