使用 Mclust 进行聚类会产生空聚类

2024-02-29

我正在尝试使用 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 https://www.file-upload.net/download-14320392/example.csv.html

我不太明白为什么 Mclust 给我一个空簇 (0),尤其是其平均值与第二个簇几乎相同。仅当专门寻找单变量、等方差模型时,才会出现这种情况。使用例如 modelNames="V" 或保留默认值,不会产生此问题。

这个线程:聚类不包含观测值 https://stackoverflow.com/questions/62918397/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)

简而言之,mclust 或 gmm 是概率模型,它估计簇的均值/方差以及属于每个簇的每个点的概率。这与 k-means 提供的硬分配不同。所以模型的似然度就是每个数据点属于每个簇的概率之和,你可以查看一下也在 mclust 的出版物中 https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5096736/

在此模型中,聚类 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

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

使用 scikit learn 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))

如果不需要等方差,可以使用GMM https://rdrr.io/cran/ClusterR/man/GMM.htmlClusterR 包中也有此功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Mclust 进行聚类会产生空聚类 的相关文章

随机推荐

  • 仅冻结 html 表格的顶行(固定表格标题滚动)

    我想制作一个顶行冻结的 html 表格 这样当你垂直向下滚动时你总是可以看到它 有没有一种聪明的方法可以在不使用 JavaScript 的情况下实现这一点 请注意 我不需要冻结左列 我知道这有几个答案 但这些都没有真正帮助我 我发现本文 h
  • 如何使用 JavaPOS 通过 Epson 打印机打印收据?

    如何开发 Java 软件来使用 Epson 收据打印机打印收据 从 Epson 网站获取 Epson JavaPOS ADK 您需要注册才能下载 确保您安装了 32 位 JVM Install the Epson JavaPOS ADK 选
  • 在Java中反转大量文本文件

    反转异步上传到 servlet 的大型文本文件 以可扩展且高效的方式反转该文件 的最佳方法是什么 文本文件可能很大 千兆字节长 可以假设多个服务器 集群环境以分布式方式执行此操作 鼓励开源图书馆考虑 我正在考虑使用 Java NIO 将文件
  • 页脚位于底部但不粘

    我试图让页脚齐平到页面底部 但不一定是粘性的 只需位于底部 以防用户向下滚动 这 有效 但页脚出现后底部似乎有一些空白 看起来有点尴尬 有谁知道CSS将页脚刷新到底部并保持在最底部而不使其粘着的最佳方法吗 如果您希望我发布我的 html c
  • 如何在 django Rest 框架中将多个变量传递给 modelViewSet?

    我在用http www django rest framework org http www django rest framework org 我有一个场景 我想根据需要从数据库获取数据来传递两个或多个变量 在下面的代码中 只有 pk 存
  • Wicket @SpringBean 不创建可序列化代理

    SpringBean PDLocalizerLogic loc 当使用上面时 我收到 java io NotSerializedException 这是因为 loc 不可序列化 但这不应该成为问题 因为 spring bean 是可序列化的
  • 将切片扩展到其容量的最简单方法是什么?

    我有一个程序 它使用缓冲池来减少代码中一些性能敏感部分的分配 像这样的事情 播放链接 https play golang org p c gsqBcbE some file or any data source var r io Reade
  • Internet Explorer 无法识别 SVG 元素的 CSS

    我有一个 SVG 图像地图 链接上带有悬停样式 有关 SVG 图像映射的更多信息here http thenewcode com 760 Create A Responsive Imagemap With SVG 我测试过的所有受人尊敬的浏
  • ChartJS 仅显示特定刻度的大字体大小

    我试图强调 X 轴上的特定值 如果它满足特定条件 例如 在我的codepen https codepen io nuclearslug pen NJGmmy我只想更改 蓝色 栏的字体大小 这对于 Chart js 来说是可能的吗 var c
  • 将文件添加到销售订单行项目

    I want to add files to salesorder line items in Acumatica using web services What endpoint should be used 我想使用 Web 服务端点添
  • 如何为 Closure 编译器设置 language_in 选项?

    我需要在 Closure 编译器上设置 language in 选项以防止 IE8 解析错误 错误 解析错误 IE8 及更低版本 将错误地解析数组和对象文本中的尾随逗号 如果您的目标是较新版本的 JS 请设置适当的 language in
  • RavenDb - 远程服务器返回错误:(403) Forbidden

    当我尝试在 RavenDb 上创建 database people 集合时 出现以下错误 远程服务器返回错误 403 禁止 我在 IIS 上热了 Raven 但我不确定发生了什么 在 raven Management Studio 上 当我
  • 单击按钮时手动触发 HTML 验证

    我正在尝试处理按钮单击时的表单验证 它正在验证表单但未显示错误 有人可以帮我吗
  • 如何在 React 上正确地将 onclick 处理程序绑定到 `this`

    解释为什么这不是重复的 我的代码已经可以工作 我已将其作为评论包含在内 问题是为什么this当我将其包含到单击处理程序函数时 上下文会发生变化 我正在尝试 React 中的计算器项目 目标是将 onclick 处理程序附加到数字按钮 以便数
  • Excel VBA将字符串的特定文本粗体设置到单元格中?

    我想将字符串中的一些文本设置为粗体 我该怎么做 通过使用角色 Range A1 Characters 8 5 Font Bold True
  • 以斜线为背景的形状

    可以画一个Shape http msdn microsoft com en us library system windows shapes v VS 95 aspx其背景是由斜线构成的 一个例子Rectangle 抱歉图像质量 如果我想要
  • Android 用动画连续移动背景

    我想做的是水平移动背景并让它无限重复 我尝试使用ImageSwitcher用动画来实现这种效果 但无法使其正常工作 这是我到目前为止的代码L public class MainActivity extends AppCompatActivi
  • 值连接不是 org.apache.spark.rdd.RDD 的成员

    我收到此错误 value join is not a member of org apache spark rdd RDD Long Int Long String Array 0 forSome type 0 lt String Doub
  • 使用不同的锚点重新加载页面

    刚刚被一个问题困住了 我有一个带有 Jquery UI 选项卡的页面 通过向链接添加哈希标签 可以从不同的页面访问每个选项卡 并使用我需要的选项卡加载页面 但是 我还需要访问同一页面中的不同选项卡 我想出的是添加目标 parent 到带有哈
  • 使用 Mclust 进行聚类会产生空聚类

    我正在尝试使用 Mclust 对我的经验数据进行聚类 使用以下非常简单的代码时 library reshape2 library mclust data lt read csv file choose header TRUE check n