微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用Mclust进行群集会导致一个空的群集

如何解决使用Mclust进行群集会导致一个空的群集

我正在尝试使用Mclust对我的经验数据进行聚类。使用以下非常简单的代码时:

library(reshape2)
library(mclust)

data <- read.csv(file.choose(),header=TRUE,check.names = FALSE)
data_melt <- melt(data,value.name = "value",na.rm=TRUE)

fit <- Mclust(data$value,modelNames="E",G = 1:7)
summary(fit,parameters = TRUE)

R给我以下结果:

---------------------------------------------------- 
Gaussian finite mixture model fitted by EM algorithm 
---------------------------------------------------- 

Mclust E (univariate,equal variance) model with 4 components: 

log-likelihood    n df       BIC       ICL
  -20504.71 3258  8 -41074.13 -44326.69

Clustering table:
1    2    3    4 
0 2271  896   91 

Mixing probabilities:
    1         2         3         4 
0.2807685 0.4342499 0.2544305 0.0305511 

Means:
   1        2        3        4 
1381.391 1381.715 1574.335 1851.667 

Variances:
   1        2        3        4 
7466.189 7466.189 7466.189 7466.189 

编辑:在此处下载我的数据https://www.file-upload.net/download-14320392/example.csv.html

我不容易理解为什么Mclust给我一个空的簇(0),尤其是平均值与第二个簇几乎相同。仅在专门寻找单变量,等方差模型时才会出现。使用例如modelNames =“ V”或将其保留为认值不会产生此问题。

此线程:Cluster contains no observations一个相似性问题,但是如果我理解正确,这似乎是由于随机生成的数据引起的吗?

对于我的问题在哪里,或者我是否缺少明显的东西,我一点也不了解。 任何帮助表示赞赏!

解决方法

正如您所注意到的,聚类1和2的平均值极为相似,并且碰巧那里有很多数据(请参见直方图的峰值):

set.seed(111)
data <- read.csv("example.csv",header=TRUE,check.names = FALSE)
fit <- Mclust(data$value,modelNames="E",G = 1:7)
hist(data$value,br=50)
abline(v=fit$parameters$mean,col=c("#FF000080","#0000FF80","#BEBEBE80","#BEBEBE80"),lty=8)

enter image description here

简而言之,mclust或gmm是概率模型,用于估计聚类的均值/方差以及属于每个聚类的每个点的概率。这不同于k均值提供的硬分配。因此,该模型的可能性是属于每个群集的每个数据点的概率之和,您可以将其检出also in mclust's publication

在此模型中,聚类1和聚类2的均值相近,但它们的预期比例不同:

fit$parameters$pro
[1] 0.28565736 0.42933294 0.25445342 0.03055627

这意味着,如果您的数据点位于1或2的均值附近,则将其始终分配给群集2,例如,让我们尝试预测1350到1400之间的数据点:

head(predict(fit,1350:1400)$z)
             1         2          3            4
[1,] 0.3947392 0.5923461 0.01291472 2.161694e-09
[2,] 0.3945941 0.5921579 0.01324800 2.301397e-09
[3,] 0.3944456 0.5919646 0.01358975 2.450108e-09
[4,] 0.3942937 0.5917661 0.01394020 2.608404e-09
[5,] 0.3941382 0.5915623 0.01429955 2.776902e-09
[6,] 0.3939790 0.5913529 0.01466803 2.956257e-09

$classification是通过以最大概率获取列而获得的。因此,同一个示例,所有内容都分配给2:

 head(predict(fit,1350:1400)$classification)
[1] 2 2 2 2 2 2

要回答您的问题,不,您没有做错任何事情,至少对于这种GMM实现而言,这是一个后备。我会说这有点过拟合,但是您基本上只能选择具有成员资格的集群。

如果您使用model =“ V”,我认为解决方案同样有问题:

fitv <- Mclust(Data$value,modelNames="V",G = 1:7)
plot(fitv,what="classification")

enter image description here

使用scikit学习GMM我没有看到类似的问题。因此,如果您需要使用具有球形均值的高斯混合,请考虑使用模糊kmeans:

library(ClusterR)
plot(NULL,xlim=range(data),ylim=c(0,4),ylab="cluster",yaxt="n",xlab="values")
points(data$value,fit_kmeans$clusters,pch=19,cex=0.1,col=factor(fit_kmeans$clusteraxis(2,1:3,as.character(1:3))

enter image description here

如果不需要相等的方差,也可以在ClusterR软件包中使用GMM函数。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。