Как подобрать модель смеси для кластеризации


15

У меня есть две переменные - X и Y, и мне нужно сделать кластер максимальным (и оптимальным) = 5. Давайте идеальный график переменных выглядит следующим образом:

введите описание изображения здесь

Я хотел бы сделать 5 кластеров из этого. Что-то вроде этого:

введите описание изображения здесь

Таким образом, я думаю, что это смешанная модель с 5 кластерами. Каждый кластер имеет центральную точку и круг доверия вокруг него.

Кластеры не всегда похожи на это, они выглядят следующим образом, где иногда два кластера находятся близко друг к другу или один или два кластера полностью отсутствуют.

введите описание изображения здесь

введите описание изображения здесь

Как можно вписать модель смеси и эффективно выполнить классификацию (кластеризацию) в этой ситуации?

Пример:

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

Ответы:


13

Вот скрипт для использования смешанной модели с использованием 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)

введите описание изображения здесь введите описание изображения здесь

В ситуации, когда существует менее 5 кластеров:

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)

введите описание изображения здесь

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

введите описание изображения здесь

В этом случае мы подгоняем 3 кластера. Что если мы поместим 5 кластеров?

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

Это может заставить сделать 5 кластеров.

введите описание изображения здесь

Также давайте введем некоторый случайный шум:

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)

mclustпозволяет кластеризацию на основе моделей с шумом, а именно отдаленные наблюдения, которые не принадлежат ни одному кластеру. mclustпозволяет указать предварительное распределение, чтобы упорядочить подгонку к данным. В priorControlmclust предусмотрена функция для определения априора и его параметров. Когда вызывается со своими значениями по умолчанию, он вызывает другую функцию с именем, defaultPriorкоторая может служить шаблоном для определения альтернативных априорных значений. Чтобы включить шум в моделирование, первоначальное предположение о наблюдениях шума должно быть предоставлено через компонент шума аргумента инициализации в Mclustили mclustBIC.

введите описание изображения здесь

Другой альтернативой будет использование mixtools пакета, который позволяет указывать среднее значение и сигма для каждого компонента.

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)

введите описание изображения здесь


2
+1 Этот ответ очень полезен, пригоден для использования и лаконичен, и является прекрасным примером того, как почти так легко сделать подобные вещи в R, даже не зная математики, стоящей за ним ...
Пол

3

Одним из стандартных подходов являются модели гауссовой смеси, которые обучаются с помощью алгоритма EM. Но так как вы также замечаете, что число кластеров может варьироваться, вы также можете рассмотреть непараметрическую модель, такую ​​как Dirichlet GMM, которая также реализована в scikit-learn.

В R эти два пакета предлагают то, что вам нужно,

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.