Как я могу записать результаты кластеризации из mclust в файл? - PullRequest
6 голосов
/ 18 января 2012

Я использую библиотеку mclust для R (http://www.stat.washington.edu/mclust), чтобы провести экспериментальную кластеризацию GMM на основе EM.Пакет отличный, и, похоже, он обычно находит очень хорошие кластеры для моих данных.

Проблема в том, что я совсем не знаю R, и хотя мне удалось запутаться в процессе кластеризации на основеСодержимое help () и обширный файл readme, я не могу понять, как записать фактические результаты кластера в файл.Я использую следующий нелепо простой сценарий для выполнения кластеризации:

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 

, которая, после размышления, которую я понял, на самом деле представляет собой список образцов и их классификаций.Я думаю, что невозможно написать это напрямую с помощью команды записи, но немного больше экспериментов в консоли 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 автоматически ...

1 Ответ

8 голосов
/ 18 января 2012

Чтобы вычислить сами параметры кластеризации (среднее, дисперсия, к какому кластеру относится каждая точка), вам нужно использовать 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")

, а затем продолжить, как и раньше.

...