2012-01-18 83 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