sábado, 25 de agosto de 2012

Clasificación utilizando modelos mixtos gausianos

Hace poco leía sobre el problema de utilizar análisis de cluster cuando los grupos eran muy homogeneos. El autor soluciono este inconveniente utilizando Máquinas de Vector Soporte (SVM). Sin embargo, la solución no me parece conveniente, porque para utilizar este procedimiento se debe tener una muestra de la cual se conozca los grupos, para considerar un modelo que permita discriminar. La cosa es que si en la muestra no tengo conocimiento de los grupos entonces no puedo utilizar está técnica. En vista de esto, me puse a investigar diferentes técnicas de clasificación y encontré una técnica muy interesante que permite clasificar, discriminar y estimar funciones de densidad  utilizando mixtura de modelos normales. El paquete en R se llama mclust.

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