Jak dopasować model mieszanki do grupowania

15

Mam dwie zmienne - X i Y i muszę ustawić klaster maksymalnie (i optymalnie) = 5. Załóżmy, że idealny wykres zmiennych wygląda następująco:

wprowadź opis zdjęcia tutaj

Chciałbym zrobić z tego 5 klastrów. Coś takiego:

wprowadź opis zdjęcia tutaj

Dlatego myślę, że jest to model mieszany z 5 klastrami. Każda grupa ma punkt środkowy i okrąg zaufania wokół niej.

Klastry nie zawsze są takie ładne, wyglądają następująco, gdzie czasami dwa klastry są blisko siebie lub całkowicie brakuje jednego lub dwóch klastrów.

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

Jak skutecznie dopasować model mieszanki i przeprowadzić klasyfikację (grupowanie) w tej sytuacji?

Przykład:

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")
rdorlearn
źródło

Odpowiedzi:

13

Oto skrypt do używania modelu mieszanki przy użyciu 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)

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

W sytuacji, gdy jest mniej niż 5 klastrów:

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)

wprowadź opis zdjęcia tutaj

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

wprowadź opis zdjęcia tutaj

W tym przypadku instalujemy 3 klastry. Co jeśli zmieścimy 5 klastrów?

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

Może zmusić do utworzenia 5 klastrów.

wprowadź opis zdjęcia tutaj

Wprowadzimy też trochę losowego hałasu:

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)

mclustumożliwia oparte na modelach grupowanie z hałasem, a mianowicie obserwacje zewnętrzne, które nie należą do żadnego skupienia. mclustpozwala określić wcześniejszą dystrybucję w celu uregulowania dopasowania do danych. W priorControlmclust dostępna jest funkcja służąca do określania wcześniejszego i jego parametrów. Po wywołaniu z ustawieniami domyślnymi wywołuje inną wywoływaną funkcję, defaultPriorktóra może służyć jako szablon do określania alternatywnych priorytetów. Aby uwzględnić szum w modelowaniu, należy podać wstępne przypuszczenie obserwacji hałasu za pośrednictwem komponentu hałasu argumentu inicjalizacji wMclust lub mclustBIC.

wprowadź opis zdjęcia tutaj

Inną alternatywą byłoby użycie mixtools pakietu, który pozwala określić średnią i sigma dla każdego elementu.

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)

wprowadź opis zdjęcia tutaj

Jan
źródło
2
+1 Ta odpowiedź jest bardzo przydatna, użyteczna i zwięzła, i stanowi doskonały przykład tego, jak prawie tak łatwo jest robić takie rzeczy w R, nawet nie znając matematyki za tym ...
Paul
3

Jednym standardowym podejściem są modele mieszanki Gaussa, które są trenowane za pomocą algorytmu EM. Ale ponieważ zauważasz również, że liczba klastrów może się różnić, możesz również rozważyć model nieparametryczny, taki jak Dirichlet GMM, który jest również implementowany w scikit-learn.

W wersji R te dwa pakiety wydają się oferować to, czego potrzebujesz,

jpmuc
źródło