如何拟合混合模型进行聚类

机器算法验证 r 聚类 高斯混合分布
2022-01-28 12:15:03

我有两个变量 - 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")
2个回答

这是使用 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允许指定先验分布以规范对数据的拟合。mclust 中提供了一个函数priorControl,用于指定先验及其参数。当使用其默认值调用时,它会调用另一个被调用的函数,该函数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)

在此处输入图像描述

一种标准方法是通过 EM 算法训练的高斯混合模型。但是由于您还注意到集群的数量可能会有所不同,因此您还可以考虑使用非参数模型,例如Dirichlet GMM,它也在scikit-learn 中实现。

在 R 中,这两个包似乎提供了你所需要的,