Voici un script pour utiliser le modèle de mélange à l'aide de 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)
Dans une situation où il y a moins de 5 grappes:
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)
Dans ce cas, nous adaptons 3 clusters. Et si nous adaptions 5 clusters?
xyMclust4 <- Mclust(data.frame (X1,Y1), G=5)
plot(xyMclust4)
Il peut forcer à faire 5 grappes.
Introduisons également du bruit aléatoire:
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
permet un regroupement basé sur un modèle avec du bruit, à savoir des observations périphériques qui n'appartiennent à aucun cluster. mclust
permet de spécifier une distribution préalable pour régulariser l'ajustement aux données. Une fonction priorControl
est fournie dans mclust pour spécifier l'a priori et ses paramètres. Lorsqu'il est appelé avec ses valeurs par défaut, il appelle une autre fonction appelée defaultPrior
qui peut servir de modèle pour spécifier des priors alternatifs. Pour inclure le bruit dans la modélisation, une première estimation des observations de bruit doit être fournie via la composante bruit de l'argument d'initialisation dans Mclust
ou mclustBIC
.
L'autre alternative serait d'utiliser un mixtools
package qui vous permet de spécifier la moyenne et le sigma pour chaque composant.
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)
Une approche standard est les modèles de mélange gaussiens qui sont entraînés au moyen de l'algorithme EM. Mais comme vous remarquez également que le nombre de clusters peut varier, vous pouvez également envisager un modèle non paramétrique comme le Dirichlet GMM qui est également implémenté dans scikit-learn.
Dans R, ces deux packages semblent offrir ce dont vous avez besoin,
la source