Как я могу записать результаты кластеризации из mclust в файл?

Я использую библиотеку 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" (в случае трех измерений).

Если я использую 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 ответ

Решение

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

и затем продолжайте как прежде.

Другие вопросы по тегам