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)
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)
xyMclust4 <- Mclust(data.frame (X1,Y1), G=3)
plot(xyMclust4)
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.
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)
mclust
permite agrupamento baseado em modelo com ruído, ou seja, observações externas que não pertencem a nenhum cluster. mclust
permite 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 defaultPrior
que 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 Mclust
ou mclustBIC
.
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)
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,
fonte