r - 如何将 mclust 中的聚类结果写入文件?

标签 r printing mclust

我正在使用 R 的 mclust 库 ( http://www.stat.washington.edu/mclust ) 来进行一些实验性的基于 EM 的 GMM 聚类。该软件包很棒,似乎通常可以为我的数据找到非常好的集群。

问题是我根本不了解 R,虽然我已经根据 help() 内容和广泛的自述文件设法搞定了聚类过程,但我一生都无法弄清楚如何将实际的聚类结果写入文件。我正在使用以下极其简单的脚本来执行聚类,

myData <- read.csv("data.csv", sep=",", header=FALSE)
attach(myData)
myBIC <- mclustBIC(myData)
mySummary <- summary( myBIC, data=myData )

此时我得到了聚类结果和摘要。 data.csv 中的数据只是多维点的列表,每行一个。因此每条线看起来都像“x,y,z”(在 3 维的情况下)。

如果我使用 2d 点(例如,仅 x 和 y 值),我可以使用内部绘图函数来获得一个非常漂亮的图表,该图表根据分配到的簇绘制原始点和每个点的颜色代码。所以我知道所有信息都在“myBIC”中,但文档和帮助似乎没有提供有关如何打印此数据的任何见解!

我想根据我认为在 myBIC 中编码的结果打印出一个新文件。比如,

CLUST x, y, z
1 1.2, 3.4, 5.2
1 1.2, 3.3, 5.2
2 5.5, 1.3, 1.3
3 7.1, 1.2, -1.0
3 7.2, 1.2, -1.1

然后 - 希望 - 也打印出聚类过程找到的各个高斯/聚类的参数/质心。

当然,这是一件非常简单的事情,而且我对 R 太无知,无法弄清楚......

编辑:我似乎已经取得了一些进步。执行以下操作会打印出一个有点神秘的矩阵,

    > mySummary$classification
[1] 1 1 2 1 3
[6] 1 1 1 3 1
[12] 1 2 1 3 1
[18] 1 3 

经过反射(reflection),我意识到这实际上是样本列表及其分类。我想不可能直接通过 write 命令来写这个,但是在 R 控制台中进行更多实验让我意识到我可以做到这一点:

> newData <- mySummary$classification
> write( newData, file="class.csv" )

结果实际上看起来相当不错!

 $ head class.csv
"","x"
"1",1
"2",2
"3",2

其中第一列显然与输入数据的索引匹配,第二列描述分配的类标识。

“mySummary$parameters”对象似乎是嵌套的,并且有一堆与各个高斯及其参数相对应的子对象等。当我尝试将其写出时,“write”函数失败,但单独写出每个子对象名称有点乏味。这引出了一个新问题:如何迭代 R 中的嵌套对象并将元素以串行方式打印到文件描述符?

我有这个“mySummary$parameters”对象。它由几个子对象组成,例如“mySummary$parameters$variance$sigma”等。我想迭代所有内容并将其全部打印到文件中,就像在 CLI 中自动完成的那样......

最佳答案

要计算实际的聚类参数本身(均值、方差、每个点属于哪个聚类),您需要使用 Mclust 。 要进行写入,您可以使用(例如)write.csv .

默认Mclust根据 BIC 确定的最佳模型计算参数,因此如果您想要这样做,您可以这样做:

myMclust <- Mclust(myData)

然后myMclust$BIC将包含所有其他模型的结果(即 myMclust$BIC 或多或少与 mclustBIC(myData) 相同)。

参见?MclustValue:栏目查看还有哪些信息myMclust有。例如,myMclust$parameters$mean是每个簇的平均值,myMclust$parameters$variance每个簇的方差,...

但是myMclust$classification将包含每个点属于哪个簇,为最佳模型计算。

因此,要获得您想要的输出,您可以执行以下操作:

# create some data for example purposes -- you have your read.csv(...) instead.
myData <- data.frame(x=runif(100),y=runif(100),z=runif(100))
# get parameters for most optimal model
myMclust <- Mclust(myData)
# if you wanted to do your summary like before:
mySummary <- summary( myMclust$BIC, data=myData )

# add a column in myData CLUST with the cluster.
myData$CLUST <- myMclust$classification
# now to write it out:
write.csv(myData[,c("CLUST","x","y","z")], # reorder columns to put CLUST first
          file="out.csv",                  # output filename
          row.names=FALSE,                 # don't save the row numbers
          quote=FALSE)                     # don't surround column names in ""

关于write.csv的注释- 如果您不输入 row.names=FALSE您将在 csv 中获得一个额外的列,其中包含行号。另外,quote=FALSE将您的列标题设置为 CLUST,x,y,z否则它们会是 "CLUST","x","y","z" 。这是你的选择。

假设我们想做同样的事情,但使用来自不是最佳的不同模型的参数。然而,Mclust默认情况下仅计算最佳模型的参数。要计算特定模型的参数(例如 "EEI" ),您需要执行以下操作:

myMclust <- Mclust(myData,modelNames="EEI")

然后像以前一样继续。

关于r - 如何将 mclust 中的聚类结果写入文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8905732/

相关文章:

r - 在包中使用 data.table 时,R CMD 检查 NOTEs : no visible global function definition for '.'

r - 遍历数据框和变量名

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

java - System.out.print ('\r' ) 不起作用

javascript - 如何在我的 Vue.js 项目中以横向模式打印 html 页面

如果一个变量是 'too constant',R Mclust(data, G = 1) 会给出奇怪的 Sigma 输出?

r - 查找并中断重复运行

r - 在 R 的正则表达式中使用变量值

java - 递归地找到一个集合中最强大的