2015-05-25 2 views
2

Для набора документов у меня есть функциональная матрица размером 30 X 32, где строки представляют собой документы и столбцы = функции. Таким образом, в основном 30 документов и 32 функции для каждого из них. После запуска алгоритма PSO я смог найти некоторые кластерные центроиды (которые я не уверен в том, что они оптимальны), каждый из которых является вектором строки длиной 32. И у меня есть вектор-столбец размером 30X1, который показывает центроид, которому был присвоен каждый документ. Поэтому индекс один из этого вектора будет содержать индекс центра тяжести, которому был назначен документ 1, и так далее. Это получается после вычисления эвклидовых расстояний каждого из документов от центроидов. Я хотел бы получить некоторые подсказки относительно того, есть ли способ в R для построения этих многомерных данных в виде кластеров. Есть ли способ, например, с помощью которого я мог бы либо свернуть эти измерения до 1-D, либо каким-то образом показать их на графике, который может быть довольно красивым. Я читал о многомерном масштабировании. До сих пор я понимаю, что это способ уменьшить многомерные данные до более низких измерений, что действительно кажется мне нужным. Итак, я попробовал его с этим кодом (центроиды [[3]] в основном состоит из 4 X 32 матрицы и представляет собой 4 центроиды):Визуализация многомерных кластеров данных в R

points <- features.dataf[2:ncol(features.dataf)] 
row.names(points) <- features.dataf[,1] 

fit <- cmdscale(points, eig = TRUE, k = 2) 
x <- fit$points[, 1] 
y <- fit$points[, 2] 
plot(x, y, pch = 19, xlab="Coordinate 1", ylab="Coordinate 2", main="Clustering Text Based on PSO", type="n") 
text(x, y, labels = row.names(points), cex=.7) 

Это дает мне эту ошибку:

Error in cmdscale(pointsPlusCentroids, eig = TRUE, k = 2) : 
    distances must be result of 'dist' or a square matrix 

Однако, похоже, это дает сюжет в порядке. Но символы pch = 19 точек не отображаются, просто текстовые имена. Примерно так:

В дополнение к выше, я хочу покрасить их таким образом, чтобы документы, которые лежат в кластере 1, окрашивались в один цвет, а в 2 - в другой цвет и так далее. Есть ли способ сделать это, если у меня есть вектор-столбец с центроидой настоящий таким образом:

 [,1] 
[1,] 1 
[2,] 3 
[3,] 1 
[4,] 4 
[5,] 1 
[6,] 4 
[7,] 3 
[8,] 4 
[9,] 4 
[10,] 4 
[11,] 2 
[12,] 2 
[13,] 2 
[14,] 2 
[15,] 1 
[16,] 2 
[17,] 1 
[18,] 4 
[19,] 2 
[20,] 4 
[21,] 1 
[22,] 1 
[23,] 1 
[24,] 1 
[25,] 1 
[26,] 3 
[27,] 4 
[28,] 1 
[29,] 4 
[30,] 1 

Может кто-нибудь пожалуйста, помогите мне с этим? Или, если есть какой-либо другой способ построения многомерных кластеров, подобных этим. Спасибо!

ответ

1

Как cmdscale требуется расстояние, попробуйте cmdscale(dist(points), eig = TRUE, k = 2). Символы не отображаются из-за type = "n". Для окрашивания текста используйте: text(x, y, rownames(points), cex = 0.6, col = centroids)

+0

Спасибо большое! Это работает отлично! – QPTR

+0

Не могли бы вы немного объяснить, как это сделать col = centroids. Я смотрю, что делает col, но его не очень очевидно, как вектор-столбец автоматически преобразуется в цвета. Спасибо. – QPTR

+1

Нет mistery. R преобразует числа 1: 8 в цвета в соответствии с 'palette()'. Se например: 'n = 5'; 'pie (rep (1, n), col = FALSE); pie (rep (1, n), col = "red"); pie (rep (1, n), col = 2); pie (rep (1, n), col = 1: 2); #recycled; pie (rep (1, n), col = 1: n); палитра(); # основные цвета; pie (rep (1, n), col = c («черный», «красный», «зеленый3», «синий», «голубой»)); pie (rep (1, n), col = rainbow (n)); pie (rep (1, n), col = terrain.colors (n)); n = 15; pie (rep (1, n), col = 1: n); #recycled; pie (rep (1, n), col = terrain.colors (n)) ' – Robert