2016-12-30 6 views
1

Я делаю кластерный анализ с R. Я использую функцию hclust(), и после выполнения кластерного анализа я хотел бы получить кластер, представляющий каждый кластер.R: Кластерный анализ с hclust(). Как получить представителей кластера?

Я определяю представителя кластера как экземпляры, наиболее близкие к центроиду кластера.

Так шаги:

  1. Поиск центроиды кластеров
  2. Поиск представителей кластера

Я уже задавал подобный вопрос, но с помощью K-средства: https://stats.stackexchange.com/questions/251987/cluster-analysis-with-k-means-how-to-get-the-cluster-representatives

Проблема, в данном случае, заключается в том, что hclust не дает центроидов!

Например, говоря, что d мои данные, что я сделал до сих пор являются:

hclust.fit1 <- hclust(d, method="single")  
groups1 <- cutree(hclust.fit1, k=3) # cut tree into 3 clusters 

## getting centroids ## 

mycentroid <- colMeans(CV)  
clust.centroid = function(i, dat, groups1) {  
    ind = (groups1 == i) 
    colMeans(dat[ind,]) 
} 

centroids <- sapply(unique(groups1), clust.centroid, data, groups1) 

Но теперь, я пытался получить представитель кластера с этим кодом (я получил его в других вопрос я спросил, для к-средства):

index <- c() 

for (i in 1:3){  
    rowsum <- rowSums(abs(CV[which(centroids==i),1:3] - centroids[i,]))  
    index[i] <- as.numeric(names(which.min(rowsum))) 
} 

И он говорит, что:

«Ошибка е2 [[J]]: в dex вне пределов "

Я был бы признателен, если бы кто-нибудь из вас мог мне немного помочь. Благодарю.

- (не) Рабочий пример кода -

example_data.txt

A,B,C 
10.761719,5.452188,7.575762 
10.830457,5.158822,7.661588 
10.75391,5.500170,7.740330 
10.686719,5.286823,7.748297 
10.864527,4.883244,7.628730 
10.701415,5.345650,7.576218 
10.820583,5.151544,7.707404 
10.877528,4.786888,7.858234 
10.712337,4.744053,7.796390 

Что касается кода:

# Install R packages 

#install.packages("fpc") 

#install.packages("cluster") 

#install.packages("rgl") 

library(fpc) 
library(cluster) 
library(rgl) 

CV <- read.csv("example_data") 

str(CV) 

data <- scale(CV) 

d <- dist(data,method = "euclidean") 
hclust.fit1 <- hclust(d, method="single") 
groups1 <- cutree(hclust.fit1, k=3) # cut tree into 3 clusters 
mycentroid <- colMeans(CV) 

clust.centroid = function(i, dat, groups1) { 
    ind = (groups1 == i) 
    colMeans(dat[ind,]) 
} 

centroids <- sapply(unique(groups1), clust.centroid, CV, groups1) 

index <- c() 
for (i in 1:3){ 
    rowsum <- rowSums(abs(CV[which(centroids==i),1:3] - centroids[i,])) 
    index[i] <- as.numeric(names(which.min(rowsum))) 
} 
+0

См. Http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example о том, как сделать воспроизводимый пример. Прямо сейчас мы не можем запустить запуск кода, не закончив много работы. – emilliman5

+0

Я просто добавил код, который пытался использовать. –

ответ

1

Иерархическая кластеризация не использовать (или вычислять) представителей.

В частности, для одной ссылки (но это может случиться и для других связей), «центр» может быть в другом кластере. Просто рассмотрим два верхних набора данных в примере:

enter link description here

Кроме того, центр тяжести (средний) соединен с евклидовым расстоянием. На других расстояниях это может быть очень плохой представитель.

Так что используйте с осторожностью!

В любом случае иерархическая кластеризация не определяет или не вычисляет представителя. Вам нужно будет это сделать самостоятельно.

+0

Спасибо. Действительно, в коде, который я написал, я пытался сделать это сам ... –

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

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