使用MCLUSTER进行群集会导致空群集 [英] Clustering with Mclust results in an empty cluster
本文介绍了使用MCLUSTER进行群集会导致空群集的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试使用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
我不太理解为什么Mcluster会给我一个空的集群(0),特别是平均值与第二个集群几乎相同的集群。只有在专门寻找单变量等方差模型时才会出现这种情况。例如,使用model Names=&q;V&q;或将其保留为默认值不会产生此问题。此线程: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)
简而言之,mcluster或GMM是概率模型,它估计簇的均值/方差以及每个点属于每个簇的概率。这与k-Means提供的硬分配不同。因此,模型的可能性是每个数据点属于每个集群的概率之和,您可以将其检出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")
使用SCRICIT学习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))
如果您不需要相等的方差,也可以使用ClusterR包中的GMM函数。
这篇关于使用MCLUSTER进行群集会导致空群集的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文