Para mirar su uso utilicemos el mismo ejercicio propuesto por rvaquerizo con el siguiente código:
#GRUPO 1
x = runif(500,70,90)
y = runif(500,70,90)
grupo1 = data.frame(cbind(x,y))
grupo1$grupo = 1
#GRUPO 2
x = runif(1000,10,40)
y = runif(1000,10,40)
grupo2 = data.frame(cbind(x,y))
grupo2$grupo = 2
#GRUPO 3
x = runif(3000,0,100)
y = runif(3000,0,100)
grupo3.1 = data.frame(cbind(x,y))
grupo3.1$separacion=(x+y)
grupo3.1 = subset(grupo3.1,separacion>=80 & separacion <=140,select=-separacion)
grupo3.1 = subset(grupo3.1,y>0)
grupo3.1$grupo = 3
#UNIMOS TODOS LOS GRUPOS
total=rbind(grupo1,grupo2,grupo3.1)
plot(total$x,total$y,col=c(1,2,3)[total$grupo])
Con ello obtenemos el siguiente gráfico:
Para utilizar la librería mclust, utilizamos el siguiente código:
library(mclust)
model<-Mclust(total[,1:2],G=3)
summary(model,parameters=TRUE)
----------------------------------------------------
Gaussian finite mixture model fitted by EM algorithm
----------------------------------------------------
Mclust VVV (ellipsoidal, varying volume, shape, and orientation) model with 3 components:
log.likelihood n df BIC
-26758.73 3016 17 -53653.66
Clustering table:
1 2 3
503 1000 1513
Mixing probabilities:
1 2 3
0.1667109 0.3284570 0.5048321
Means:
[,1] [,2] [,3]
x 79.92795 24.61028 54.66005
y 79.64007 24.77596 53.36168
Variances:
[,,1]
x y
x 33.582877 3.628248
y 3.628248 39.125187
[,,2]
x y
x 76.488172 3.252094
y 3.252094 73.789833
[,,3]
x y
x 699.3611 -537.9111
y -537.9111 677.0459
Notese que al utilizar el paquete el considera la mixtura de tres normales bivariadas, en la cual se observa los parámetros de cada normal bivariada. Para considerar la mixtura el considera a cada normal con la siguientes probabilidades 0.1667109, 0.3284570, 0.5048321. Para observar gráficamente la clasificación utilizamos plot(model) y obtenemos las siguientes gráficas:
Notese que la clasificación utilizando la mixtura de modelos normales es baste buena. graficando la clasificación obtemos lo siguiente
clust<-predict(model)$classification
plot(total$x,total$y,col=c(1,3,2)[clust])
para mirar que tan buena es la clasificación utilizamos lo siguiente:
addmargins(table(total$grupo,c(1,2,3)[clust]))
1 2 3 Sum
1 500 0 0 500
2 0 1000 0 1000
3 3 0 1513 1516
Sum 503 1000 1513 3016
El error de mala clasificación es de 3/3016=0.00099469. Esta clasificación es excelente.
No hay comentarios:
Publicar un comentario