Le principal problème de l'analyse par grappes de données pratiques est la présence de valeurs aberrantes. La plupart des méthodes de clustering existantes ne prennent pas en compte leur existence, de ce fait, des observations manifestement anormales sont incluses dans la composition de certains clusters, ce qui peut sérieusement déplacer leurs centres et affecter la qualité de la classification. Bien sûr, vous pouvez d'abord vérifier les données initiales pour les valeurs aberrantes, les éliminer, etc., mais la tâche se transformera ensuite en une tâche en deux étapes, mais nous aimerions que ce soit "tout à la fois".
L'une des approches pour résoudre ce problème (pour que la méthode de clustering filtre automatiquement les valeurs aberrantes) s'appelait « estimateur de maximum de vraisemblance impropre et optimisé de manière optimale » et a été décrite dans cet article de 2017 ( http://dx.doi.org/10.1080/ 01621459.2015. 1100996 ), et a récemment reçu une implémentation dans R. Parlons-en.
Un moment de théorie
En bref, le clustering utilisant des algorithmes EM est basé sur l'hypothèse que des clusters spécifiques ont une forme proche de la forme d'une distribution normale multivariée. Ensuite, le problème de clustering peut être considéré comme le problème de séparation des composants du mélange, et les clusters sont déterminés en fonction de la probabilité de tomber dans l'un ou l'autre composant.
La mise à niveau mathématique de l'algorithme classique est qu'une hypothèse légèrement différente est prise. On pense que la fonction de probabilité de la distribution des points est la somme d'un mélange de gaussiennes et d'une distribution uniforme de points de bruit (on suppose que les valeurs aberrantes sont distribuées uniformément), c'est-à-dire
Cela conduit à une certaine complication de la solution du problème d'optimisation, qui ressemble maintenant à une solution au problème maximum
mais avec de telles restrictions
Ce problème d'optimisation (notamment avec des conditions imposées sur le rapport des valeurs propres) n'a pas toujours de solution. Les auteurs sont honnêtes à ce sujet, mais ils affirment également que leur algorithme est assez facile à gérer avec des clusters de forme plutôt complexe. Allons vérifier
Expérience
- , .
library(ggplot2)
#
set.seed(739)
n <- 500 # numer of points
y <- abs(c(rnorm(n,5,2)))
x <- c(rnorm(n,5,1))/sqrt(y)
class<-rep(1,n)
dat1 <- as.data.frame(cbind(x,y,class)) # - -
y <- c(rnorm(n,8,0.4))
x <- rlnorm(n, meanlog = log(7), sdlog = 0.2)
class<-rep(2,n)
dat2 <- as.data.frame(cbind(x,y,class)) # -
y <- c(runif(n, min = 2, max = 7))
x <- c(rnorm(n,8,0.4))
class<-rep(3,n)
dat3 <- as.data.frame(cbind(x,y,class)) # -
y <- c(runif(n/10, min = 0, max = 10))
x <- c(runif(n/10, min = 0, max = 10))
class<-rep(0,n/10)
dat4 <- as.data.frame(cbind(x,y,class)) #
dat <- rbind(dat1,dat2,dat3,dat4)
colnames(dat) <- c("x","y", "class")
dat$class <- as.factor(dat$class)
dat_test <- as.data.frame(dat)
p_base <- ggplot(dat,aes(x=x,y=y,color=class)) + geom_point()
ggExtra::ggMarginal(p_base, groupColour = TRUE, groupFill = TRUE)
otrimle , , . 2 5, .
library(otrimle)
clus <- otrimleg(dat[,c(1,2)], G=2:5, monitor=1) # monitor
-
, ( , , , , iloglik . , , 4 5 3 - ). . , ,
clus$solution
Noise - , . ( 1,2,10 ) - 5 .
clus_2 <-otrimle(dat[,c(1,2)], G = 5, npr.max = 0.01, erc = 20, monitor = TRUE)
# npr.max -
# erc - /
clus_2$code
clus_2$flag
clus_2$code 0, , , clus_2$code = 1, , EM- ( ), clus_2$code = 2, , .
clus_2$flag .
clus_2$flag = 1,
, , 0.
clus_2$flag = 2,
clus_2$flag = 3,
clus_2$flag = 4,
(clus_2$code = 2, clus_2$flag = 4), .
clus_2$mean #
head(clus_2$tau) #
head(clus_2$cluster) #
. , .
On peut noter que même si l'on devine avec le nombre de clusters (3), alors les résultats du clustering, en fait, seront très différents des vrais - et une image plus adéquate sera donnée par des partitions avec un plus grand nombre de grappes que dans la réalité. Cela était dû à la forme non elliptique des clusters, mais en général, l'algorithme fonctionne bien même dans des conditions de bruit.