2014-09-21 1 views
1

У меня есть кластерный график R, в то время как я хочу оптимизировать «критерий локтя» кластеризации с помощью wss-графика, но я не знаю, как нарисовать wss-график для кластера, кто-нибудь мне поможет?Как нарисовать график внутри кластерных сумм квадратов для кластера?

Вот мои данные:

Friendly<-c(0.467,0.175,0.004,0.025,0.083,0.004,0.042,0.038,0,0.008,0.008,0.05,0.096) 
Polite<-c(0.117,0.55,0,0,0.054,0.017,0.017,0.017,0,0.017,0.008,0.104,0.1) 
Praising<-c(0.079,0.046,0.563,0.029,0.092,0.025,0.004,0.004,0.129,0,0,0,0.029) 
Joking<-c(0.125,0.017,0.054,0.383,0.108,0.054,0.013,0.008,0.092,0.013,0.05,0.017,0.067) 
Sincere<-c(0.092,0.088,0.025,0.008,0.383,0.133,0.017,0.004,0,0.063,0,0,0.188) 
Serious<-c(0.033,0.021,0.054,0.013,0.2,0.358,0.017,0.004,0.025,0.004,0.142,0.021,0.108) 
Hostile<-c(0.029,0.004,0,0,0.013,0.033,0.371,0.363,0.075,0.038,0.025,0.004,0.046) 
Rude<-c(0,0.008,0,0.008,0.017,0.075,0.325,0.313,0.004,0.092,0.063,0.008,0.088) 
Blaming<-c(0.013,0,0.088,0.038,0.046,0.046,0.029,0.038,0.646,0.029,0.004,0,0.025) 
Insincere<-c(0.075,0.063,0,0.013,0.096,0.017,0.021,0,0.008,0.604,0.004,0,0.1) 
Commanding<-c(0,0,0,0,0,0.233,0.046,0.029,0.004,0.004,0.538,0,0.146) 
Suggesting<-c(0.038,0.15,0,0,0.083,0.058,0,0,0,0.017,0.079,0.133,0.442) 
Neutral<-c(0.021,0.075,0.017,0,0.033,0.042,0.017,0,0.033,0.017,0.021,0.008,0.717) 

data <- data.frame(Friendly,Polite,Praising,Joking,Sincere,Serious,Hostile,Rude,Blaming,Insincere,Commanding,Suggesting,Neutral) 

И вот мой код кластеризация:

cor <- cor (data) 
dist<-dist(cor) 
hclust<-hclust(dist) 
plot(hclust) 

И получите дендрограммы после выполнения кода выше, в то время как я могу нарисовать сюжет как это:

enter image description here

ответ

6

Если я следую за то, что вы хотите, то п нам нужна функция для вычисления WSS

wss <- function(d) { 
    sum(scale(d, scale = FALSE)^2) 
} 

и обертку для этой wss() функции

wrap <- function(i, hc, x) { 
    cl <- cutree(hc, i) 
    spl <- split(x, cl) 
    wss <- sum(sapply(spl, wss)) 
    wss 
} 

Эта оболочка имеет следующие аргументы, входы:

  • i числа кластеров вырезать данные в
  • hc объект иерархического кластерного анализа
  • x исходные данные

wrap обрезает дендрограммы в i кластеров, разбивает исходные данные в составе кластера, дается cl и вычисляет WSS для каждого кластера. Эти значения WSS суммируются, чтобы дать WSS для этой кластеризации.

Бежим все это с помощью sapply по числу кластеров 1, 2, ..., nrow(data)

res <- sapply(seq.int(1, nrow(data)), wrap, h = cl, x = data) 

screeplot можно сделать с помощью

plot(seq_along(res), res, type = "b", pch = 19) 

Вот пример использования известный набор данных Эдгара Андерсона Ириса:

iris2 <- iris[, 1:4] # drop Species column 
cl <- hclust(dist(iris2), method = "ward.D") 

## Takes a little while as we evaluate all implied clustering up to 150 groups 
res <- sapply(seq.int(1, nrow(iris2)), wrap, h = cl, x = iris2) 
plot(seq_along(res), res, type = "b", pch = 19) 

Это дает:

enter image description here

Мы можем увеличить, просто показывая первые 1:50 кластеры

plot(seq_along(res[1:50]), res[1:50], type = "o", pch = 19) 

который дает

enter image description here

Вы можете ускорить основной шаг вычислений либо запустив sapply() через соответствующую параллельную альтернативу или просто сделайте вычисление для меньшего количества чем nrow(data) кластеров, т.е.

res <- sapply(seq.int(1, 50), wrap, h = cl, x = iris2) ## 1st 50 groups 
+0

Спасибо! Но почему значения по оси y настолько велики, что мои данные очень малы? Кроме того, можете ли вы ответить на мой другой вопрос о wss-сюжете, например: https://stackoverflow.com/questions/25977798/why-is-the-line-of-wss-plot-for-optimize-the- cluster-analysis-looks-so-fluctuua –

+0

Значения по оси y определяются шкалой переменных в ваших данных. Я посмотрю на другую Q. –

 Смежные вопросы

  • Нет связанных вопросов^_^