Как записать результаты кластеризации из 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 )

в этот момент у меня есть результаты кластера и резюме. Данные в данных.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, чтобы понять это...

EDIT: кажется, я немного продвинулся вперед. Выполнение следующего распечатывает несколько загадочную матрицу,

    > 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

где первый столбец, по-видимому, соответствует индексу для входных данных, а второй столбец описывает присвоенный идентификатор класса.

объект "mySummary$parameters" кажется вложенным, хотя и имеет кучу подобъектов, соответствующих отдельным гауссам и их параметрам и т. д. Функция "write" терпит неудачу, когда я пытаюсь просто записать ее, но индивидуально написание каждого имени подобъекта немного утомительно. Это приводит меня к новому вопросу: Как выполнить итерацию вложенного объекта в R и распечатать элементы последовательно в файловый дескриптор?

у меня есть этот объект "mySummary$parameters". Он состоит из нескольких подобъектов, таких как "mySummary$parameters$variance$sigma" и т. д. Я хотел бы просто повторить все и распечатать все это в файл так же, как это делается с CLI автоматически...

1 ответов


чтобы вычислить фактические параметры кластеризации (среднее значение, дисперсия, к какому кластеру принадлежит каждая точка), вам нужно использовать Mclust. Для записи вы можете использовать (например) write.csv.

по умолчанию Mclust вычисляет параметры на основе наиболее оптимальной модели, определенной BIC, поэтому, если это то, что вы хотите сделать, вы можете сделать:

myMclust <- Mclust(myData)

затем myMclust$BIC будет содержать результаты всех других моделей (т. е. myMclust$BIC более-менее то же самое as mclustBIC(myData)).

посмотреть ?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")

и затем выполнить до.