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

si2*_*19e 6 printing r 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 )
Run Code Online (Sandbox Code Playgroud)

此时我有集群结果和摘要.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
Run Code Online (Sandbox Code Playgroud)

然后 - 希望 - 还打印出聚类过程发现的各个高斯/聚类的参数/质心.

当然这是一件非常容易做的事情,而我对R一无所知也无法理解......

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

    > mySummary$classification
[1] 1 1 2 1 3
[6] 1 1 1 3 1
[12] 1 2 1 3 1
[18] 1 3 
Run Code Online (Sandbox Code Playgroud)

经过反思,我意识到实际上是样本列表及其分类.我想不可能通过write命令直接写这个,但是R控制台中的一些实验让我意识到我可以这样做:

> newData <- mySummary$classification
> write( newData, file="class.csv" )
Run Code Online (Sandbox Code Playgroud)

而结果实际上看起来很不错!

 $ head class.csv
"","x"
"1",1
"2",2
"3",2
Run Code Online (Sandbox Code Playgroud)

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

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

我有这个'mySummary $ parameters'对象.它由几个子对象组成,如'mySummary $ parameters $ variance $ sigma'等.我想迭代所有内容并将其全部打印到文件中,方法与自动完成此操作相同...

mat*_*fee 8

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

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

myMclust <- Mclust(myData)
Run Code Online (Sandbox Code Playgroud)

然后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 ""
Run Code Online (Sandbox Code Playgroud)

关于write.csv- 如果你没有输入row.names=FALSE你的说明,你的csv中会有一个包含行号的额外列.另外,quote=FALSE将列标题放在一边,CLUST,x,y,z否则它们就是"CLUST","x","y","z".这是你的选择.

假设我们想要做同样的事情,但是使用不是最佳的不同模型的参数.但是,Mclust默认情况下,仅为最佳模型计算参数.要计算特定模型的参数(比方说"EEI"),您需要:

myMclust <- Mclust(myData,modelNames="EEI")
Run Code Online (Sandbox Code Playgroud)

然后像以前一样继续