Come adattare il modello di miscela per il clustering


15

Ho due variabili: X e Y e ho bisogno di rendere il cluster massimo (e ottimale) = 5. Facciamo un diagramma ideale delle variabili come il seguente:

inserisci qui la descrizione dell'immagine

Vorrei creare 5 cluster di questo. Qualcosa come questo:

inserisci qui la descrizione dell'immagine

Quindi penso che questo sia un modello misto con 5 cluster. Ogni cluster ha un punto centrale e un cerchio di fiducia attorno ad esso.

I cluster non sono sempre così belli, sembrano i seguenti, in cui a volte due cluster sono vicini tra loro o uno o due cluster sono completamente mancanti.

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

Come può adattarsi al modello di miscela ed eseguire la classificazione (clustering) in questa situazione in modo efficace?

Esempio:

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")

Risposte:


13

Ecco lo script per l'utilizzo del modello di miscela con 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)

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

In una situazione in cui ci sono meno di 5 cluster:

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)

inserisci qui la descrizione dell'immagine

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

inserisci qui la descrizione dell'immagine

In questo caso stiamo inserendo 3 cluster. Che cosa succede se inseriamo 5 cluster?

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

Può forzare a creare 5 cluster.

inserisci qui la descrizione dell'immagine

Inoltre introduciamo un po 'di rumore casuale:

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)

mclustconsente il clustering basato sul modello con rumore, vale a dire osservazioni periferiche che non appartengono a nessun cluster. mclustconsente di specificare una distribuzione precedente per regolarizzare l'adattamento ai dati. Una funzione priorControlè fornita in mclust per specificare il precedente e i suoi parametri. Quando viene chiamato con i suoi valori predefiniti, invoca un'altra funzione chiamata defaultPriorche può servire da modello per specificare i priori alternativi. Per includere il rumore nella modellazione, è necessario fornire un'ipotesi iniziale delle osservazioni sul rumore tramite il componente noise dell'argomento di inizializzazione in Mclusto mclustBIC.

inserisci qui la descrizione dell'immagine

L'altra alternativa sarebbe quella di utilizzare il mixtools pacchetto che consente di specificare mean e sigma per ciascun componente.

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)

inserisci qui la descrizione dell'immagine


2
+1 Questa risposta è molto utile, utilizzabile e concisa, e un esempio perfetto di come sia quasi troppo facile fare cose come questa in R senza nemmeno conoscere la matematica dietro di essa ...
Paul

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.