Я делаю кластерный анализ с R. Я использую функцию hclust()
, и после выполнения кластерного анализа я хотел бы получить кластер, представляющий каждый кластер.R: Кластерный анализ с hclust(). Как получить представителей кластера?
Я определяю представителя кластера как экземпляры, наиболее близкие к центроиду кластера.
Так шаги:
- Поиск центроиды кластеров
- Поиск представителей кластера
Я уже задавал подобный вопрос, но с помощью 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)))
}
См. Http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example о том, как сделать воспроизводимый пример. Прямо сейчас мы не можем запустить запуск кода, не закончив много работы. – emilliman5
Я просто добавил код, который пытался использовать. –