2012-01-18 85 views
6

我使用R的mclust库(http://www.stat.washington.edu/mclust)做一些实验性的基于EM的GMM聚类。该软件包非常棒,似乎通常可以为我的数据找到非常好的群集。如何将mclust的聚类结果写入文件?

问题是,我根本不知道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 vals),我可以使用内部绘图函数来获得一个非常漂亮的图形,它根据分配给它的集群绘制每个点的原始点和颜色代码。所以我知道所有的信息都在'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 

其反射后,我意识到其实是样品及其分类的列表。我想这是不可能直接通过写命令写这篇文章,但在R控制台更多的实验使我意识到,我可以这样做:

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

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

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

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

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

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

回答

8

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

默认情况下Mclust计算基于最优化模型中的参数如BIC确定的,因此,如果这是你想做的事,你可以这样做:

myMclust <- Mclust(myData) 

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

请参阅Value:部分中的?Mclust以了解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") 

,然后像以前一样继续进行。

+0

太棒了!非常感谢你的详细的破败。我想这将需要一段时间才能习惯R的怪癖(就像任何新语言一样)。这给了我一些重要的见解。我也非常惊讶于我已经设法做了多少事,而不知道任何关于R的事情。再次感谢。 – si28719e 2012-01-18 06:44:13

+0

我很像你那样陷入了R,所以我知道你的意思,当我第一次开始时,我感觉自己像一只猴子在我的键盘上甩开:P祝你好运! – 2012-01-18 06:46:00

+0

我知道评论应该避免“+1”和“谢谢”,但是'myData $ CLUST < - myMclust $ classification'&'myMclust < - Mclust(myData,modelNames =“EEI”)'很美,正是我需要。我还附加了z分数('MyData $ PROB < - MyClust $ z')以查看每个记录的集群成员的相对概率。 – NiuBiBang 2014-07-15 17:16:00