Comment adapter le modèle de mélange pour le clustering

15

J'ai deux variables - X et Y et je dois faire un cluster maximum (et optimal) = 5. Disons que le tracé idéal des variables est comme suit:

entrez la description de l'image ici

Je voudrais en faire 5 clusters. Quelque chose comme ça:

entrez la description de l'image ici

Je pense donc que c'est un modèle de mélange avec 5 grappes. Chaque grappe a un point central et un cercle de confiance autour d'elle.

Les clusters ne sont pas toujours assez comme ça, ils ressemblent à ce qui suit, où parfois deux clusters sont rapprochés ou un ou deux clusters sont complètement manquants.

entrez la description de l'image ici

entrez la description de l'image ici

Comment adapter le modèle de mélange et effectuer efficacement la classification (clustering) dans cette situation?

Exemple:

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
la source

Réponses:

13

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)

entrez la description de l'image ici entrez la description de l'image ici

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)

entrez la description de l'image ici

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

entrez la description de l'image ici

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.

entrez la description de l'image ici

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)

mclustpermet un regroupement basé sur un modèle avec du bruit, à savoir des observations périphériques qui n'appartiennent à aucun cluster. mclustpermet de spécifier une distribution préalable pour régulariser l'ajustement aux données. Une fonction priorControlest 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 defaultPriorqui 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 Mclustou mclustBIC.

entrez la description de l'image ici

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)

entrez la description de l'image ici

John
la source
2
+1 Cette réponse est très utile, utilisable et succincte, et un exemple parfait de la façon dont il est presque trop facile de faire des choses comme ça en R sans même connaître les mathématiques derrière elle ...
Paul
3

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,

jpmuc
la source