Agrupando datos ruidosos o con valores atípicos

9

Tengo datos ruidosos de dos variables como esta.

x1 <- rep(seq(0,1, 0.1), each = 3000)
set.seed(123)
y1 <- rep (c(0.2, 0.8, 0.3, 0.9, 0.65, 0.35,0.7,0.1,0.25, 0.3, 0.95), each = 3000)
set.seed(1234)
e1 = rnorm(length(x1), 0.07,0.07)
set.seed(1223)
e2 = rnorm(length(x1), 0.07,0.07)
set.seed(1334)
yn <- rnorm(20000, 0.5,0.9)
set.seed(2344)
xn <- rnorm(20000, 0.5,0.9)
y <- c(y1 + e1,yn) 
x <- c(x1 + e2, xn) 
plot(x,y,  xlim=c(0,1.2), ylim = c(0,1.2), pch = ".", col = "gray40") 

Puedo ver visualmente que hay 10 grupos potenciales en una mirada más cercana.

ingrese la descripción de la imagen aquí

Sin embargo, toda la información tiene muchos puntos repartidos:

plot(x,y,   pch = ".", col = "gray40") 

ingrese la descripción de la imagen aquí

Me gustaría hacer 10 grupos. Intenté el análisis de conglomerados K-means.

xm1 <- cbind(x,y)
cl1 <- kmeans(xm1, 10)
colrs <- c("red", "green", "blue1", "pink", "green4","tan", 
 "gray40", "yellow", "black", "purple") 
plot(xm1, col = colrs[cl1$cluster], pch = ".", xlim=c(0,1.2), ylim = c(0,1.2))

ingrese la descripción de la imagen aquí

plot(xm1, col = colrs[cl1$cluster], pch = ".")

ingrese la descripción de la imagen aquí

¿Hay alguna forma (puede ser el kernel k-means, vecinos más cercanos) que pueda hacer más justicia a este tipo de datos? Si es así, ¿cómo puedo hacer esto?

rdorlearn
fuente
1
¿Qué tiene de malo lo que tienes hasta ahora? ¿Por qué es inaceptable lo que tiene (el análisis de conglomerados k-means )?
Steve S
Eche un vistazo a dbscan u algoritmos ópticos (ver en.wikibooks.org/wiki/Data_Mining_Algorithms_In_R/Clustering/… )
Giorgio Spedicato

Respuestas:

6

Como sus datos parecen estar compuestos de mezclas gaussianas, intente el modelado de mezclas gaussianas (también conocido como: agrupación EM). Esto debería producir resultados muy superiores a k-means en este tipo de datos.

Si su "ruido" está distribuido uniformemente, también puede agregar una distribución uniforme a su modelo de mezcla.

Si sus datos están mucho menos limpios, considere usar DBSCAN, MeanShift, OPTICS, HDBSCAN *, ... - el clusterig basado en densidad parece ser apropiado para estos datos. DBSCAN también es muy tolerante al ruido (la "N" es para el ruido).

HA SALIDO - Anony-Mousse
fuente
3

Te recomiendo que mires este artículo. Los autores proponen un método robusto donde se eliminan los valores atípicos y el resto de datos se agrupa. Por eso llamaron al método "recorte". También había un paquete R tclust pero de acuerdo con esto , se eliminó de CRAN. De todos modos, vale la pena leer el artículo.

Miroslav Sabo
fuente