我在那里阅读了该线程,但在该线程中,答案是使用群集 i 的列均值(因此,如果我总共有 3 个群集,则 i = 1、2、3;如果我总共有 2 个群集,则 i = 1,2)。我将在此处复制并粘贴他们的答案:
clusters = cutree(hclust(dist(USArrests)), k=5) # get 5 clusters
# function to find medoid in cluster i
clust.centroid = function(i, dat, clusters) {
ind = (clusters == i)
colMeans(dat[ind,])
}
sapply(unique(clusters), clust.centroid, USArrests, clusters)
[,1] [,2] [,3] [,4] [,5]
Murder 11.47143 8.214286 5.59 14.2 2.95
Assault 263.50000 173.285714 112.40 336.0 62.70
UrbanPop 69.14286 70.642857 65.60 62.5 53.90
Rape 29.00000 22.842857 17.27 24.0 11.51
但这对我来说没有意义!如果我有一个包含 3 个变量/列的数据集,并且我只想要 2 个集群,使用他们的方法,只使用第 1 列和第 2 列的列平均值,并且永远不会计算第 3 列的列平均值!
假设我创建了这样的数据表:
a = c(1,2,3,4,2,2,5,3,1)
b = c(4,5,2,2,1,1,1,1,3)
c = c(1,1,1,0,0,0,0,0,1)
abc = data.frame(a=a, b=b, c=c)
str(abc)
最后一行将返回如下数据表:
'data.frame': 9 obs. of 3 variables:
$ a: num 1 2 3 4 2 2 5 3 1
$ b: num 4 5 2 2 1 1 1 1 3
$ c: num 1 1 1 0 0 0 0 0 1
然后我缩放数据:
abc_scaled = scale(abc)
计算距离并创建层次聚类并切割树:
distance = dist(abc_scaled, method="euclidean")
hcluster = hclust(distance, method="ward.D")
clusters = cutree(hcluster, h = (max(hcluster$height) - 0.1))
假设我得到了 2 个集群,我如何比较这 2 个集群的质心?以及如何将标签添加到集群???