我正在使用 R 进行一些聚类分析。我正在使用hclust()
函数,在执行聚类分析之后,我希望得到每个聚类的聚类代表。
我将群集代表定义为最接近群集质心的实例。
所以步骤是:
我已经问过类似的问题,但使用K-means: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)
但是现在,我试图通过这个代码获得集群代表(我在其他问题中得到了它,对于k-means):
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)))
}
它说:
“e2 [[j]]出错:索引超出限制”
如果你们中的任何人能给我一点帮助,我将不胜感激。感谢。
- (不是)代码的工作示例 -
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 :(得分:1)
分层聚类不使用(或计算)代表。
特别是对于单个链接(但也可能发生在其他链接中),“中心”可以位于不同的群集中。只需考虑示例中的前两个数据集:
此外,质心(平均值)与欧几里德距离相关。对于其他距离,它可能是一个非常糟糕的代表。
所以要小心使用!
无论哪种方式,分层聚类都不会定义或计算代表。您必须自己 。