8

R 用の mclust ライブラリ ( http://www.stat.washington.edu/mclust ) を使用して、実験的な EM ベースの GMM クラスタリングを行っています。このパッケージは素晴らしく、通常、私のデータに非常に適したクラスターを見つけているようです。

問題は、私が R についてまったく知らないことです。help() の内容と詳細な readme に基づいてクラスタリング プロセスをなんとかごちゃ混ぜにしましたが、書き出す方法を一生理解することはできません。ファイルへの実際のクラスター結果。クラスタリングを実行するために、次の非常に単純なスクリプトを使用しています。

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

その時点で、クラスターの結果と要約があります。data.csv のデータは、1 行に 1 つずつ、多次元ポイントの単なるリストです。したがって、各線は「x、y、z」のように見えます (3 次元の場合)。

2 次元の点 (たとえば、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 

よく考えてみると、これは実際にはサンプルとその分類のリストであることに気付きました。write コマンドを使用してこれを直接書き込むことはできないと思いますが、R コンソールでもう少し実験を行うと、これが可能であることがわかりました。

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

そして、結果は実際にはかなりきれいに見えます!

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

ここで、最初の列は明らかに入力データのインデックスと一致し、2 番目の列は割り当てられたクラス ID を示しています。

ただし、「mySummary$parameters」オブジェクトはネストされているように見え、個々のガウス分布とそのパラメーターなどに対応する一連のサブオブジェクトがあります。「書き込み」関数は、書き出そうとすると失敗しますが、個別に書き込みます各サブオブジェクト名を出すのは少し面倒です。R でネストされたオブジェクトを反復処理し、その要素をシリアル形式でファイル記述子に出力するにはどうすればよいですか?

この「mySummary$parameters」オブジェクトがあります。これは、「mySummary$parameters$variance$sigma」などのいくつかのサブオブジェクトで構成されています。CLI に対して自動的に行われるのと同じ方法で、すべてを反復処理してすべてファイルに出力したいと思います...

4

1 に答える 1

10

実際のクラスタリング パラメーター自体 (平均、分散、各ポイントが属するクラスター) を計算するには、 を使用する必要がありますMclust。書き込みを行うには、(たとえば) を使用できますwrite.csv

既定Mclustでは、BIC によって決定された最適なモデルに基づいてパラメーターが計算されるため、それを実行したい場合は、次の操作を実行できます。

myMclust <- Mclust(myData)

次にmyMclust$BIC、他のすべてのモデルの結果が含まれます (つまりmyMclust$BIC、ほぼ と同じmclustBIC(myData)です)。

?Mclustその他の情報については、Value:セクションを参照してください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")

その後は前と同じように進みます。

于 2012-01-18T06:35:43.420 に答える