如何找到&;标记由hclust()在R中创建的簇的质心?
我读了这个线程,但在这个线程中,答案是使用集群I的列平均值(因此,如果我总共有3个集群,I=1,2,3;如果我总共有2个集群,I=1,2)。 我将把他们的答案复制粘贴到这里:如何找到&;标记由hclust()在R中创建的簇的质心?,r,cluster-analysis,centroid,hclust,R,Cluster Analysis,Centroid,Hclust,我读了这个线程,但在这个线程中,答案是使用集群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 = 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
最后一行将返回以下数据表:
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))
假设得到两个簇,如何比较这两个簇的质心?如何将标签添加到集群?但这里您使用的是data.frame的三列?这一部分我不清楚“假设我有一个数据集,有3个变量/列,第4列是响应变量(我不会在聚类过程中使用),我只想要2个聚类,使用它们的方法,我只使用第1列和第2列的列平均值(因为只有2个聚类),第3列的列平均值永远不会被使用!”嗨,文森博霍姆。因此,数据集总共有4列,第4列是响应变量,因此不包括在聚类过程中。因此,在我的示例中,我只有3列数据。这现在更有意义了吗?但我仍然不清楚=“只使用了第1列和第2列的列平均值,第3列的列平均值永远不会计算!”嗨@VincentBonhome,如果你阅读了我链接到的线程,你就会明白我在说什么。也许我应该把他们的答案抄到我的帖子上,这样你就更容易理解了?我现在就可以。我确实读过,但还是不明白。也许我是问题所在;-)但是这里您使用的是data.frame的三列?这一部分我不清楚“假设我有一个数据集,有3个变量/列,第4列是响应变量(我不会在聚类过程中使用),我只想要2个聚类,使用它们的方法,我只使用第1列和第2列的列平均值(因为只有2个聚类),第3列的列平均值永远不会被使用!”嗨,文森博霍姆。因此,数据集总共有4列,第4列是响应变量,因此不包括在聚类过程中。因此,在我的示例中,我只有3列数据。这现在更有意义了吗?但我仍然不清楚=“只使用了第1列和第2列的列平均值,第3列的列平均值永远不会计算!”嗨@VincentBonhome,如果你阅读了我链接到的线程,你就会明白我在说什么。也许我应该把他们的答案抄到我的帖子上,这样你就更容易理解了?我现在就可以。我确实读过,但还是不明白。也许我是问题所在;-)