问题描述
我想进行层次聚类分析。我知道hclust()函数,但不知道如何在实践中使用它;我一直坚持将数据提供给函数并处理输出。
我想要对给定度量进行聚类的主要问题。
我还想将层次聚类与kmeans()产生的聚类进行比较。同样,我不确定如何调用此函数或使用/操作该函数的输出。
我的数据类似于:
df<-structure(list(id=c(111,111,112,112),se=c(1,2,3,1,3),t1 = c(1,t2 = c(1,4),t3 = c(1,1),t4 = c(2,5,7,2),t5 = c(1,t6 = c(1,t7 = c(1,t8=c(0,0)),row.names = c(NA,6L),class = "data.frame")
我想进行层次聚类分析,以确定最佳聚类数。
如何基于预定义的度量进行聚类-在这种情况下,例如聚类2号度量?
解决方法
对于层次集群,必须定义一个基本元素。它是计算每个数据点之间距离的方法。聚类是一种最先进的技术,因此您必须根据公平数据点的分布方式定义聚类数。我将在下一个代码中教您如何执行此操作。我们将使用您的数据df
和函数hclust()
比较三种距离的方法:
第一种方法是平均距离,该方法计算所有点的所有距离的平均值。我们将省略第一个变量,因为它是一个id:
#Method 1
hc.average <- hclust(dist(df[,-1]),method='average')
第二种方法是完整距离,它计算所有点在所有距离上的最大值:
#Method 2
hc.complete<- hclust(dist(df[,method='complete')
第三种方法是单一距离,它计算所有点在所有距离上的最小值:
#Method 3
hc.single <- hclust(dist(df[,method='single')
使用所有模型,我们都可以分析组。
我们可以根据层次树的高度定义聚类数,最大树的高度将只有一个聚类等于所有数据集。选择高度的中间值是一种标准。
使用平均值方法,高度值3将产生四组,而值4.5左右将产生2组:
plot(hc.average,xlab='')
输出:
与完整方法相比,结果相似,但是高度的比例尺已更改。
plot(hc.complete,xlab='')
输出:
最后,单一方法会为组产生不同的方案。一共有三个组,即使中间选择高度,您也将始终具有该数量的簇:
plot(hc.single,xlab='')
输出:
您可以使用任何需要使用cutree()
函数来确定数据聚类的方法,在该函数中设置模型对象和聚类数。确定群集性能的一种方法是检查组的同质性。这取决于研究人员的标准。接下来是将群集添加到数据中的方法。我将选择最后一个模型和三个组:
#Add cluster
df$Cluster <- cutree(hc.single,k = 3)
输出:
id se t1 t2 t3 t4 t5 t6 t7 t8 Cluster
1 111 1 1 1 1 2 1 1 1 0 1
2 111 2 2 2 0 5 0 1 1 0 2
3 111 3 1 2 0 7 1 1 1 0 2
4 112 1 1 1 0 7 1 1 1 0 2
5 112 2 1 1 2 1 1 1 1 0 1
6 112 3 3 4 1 2 1 1 1 0 3
函数cutree()
还具有一个名为h
的参数,您可以在其中设置高度(如前所述),而不是簇数k
。
关于您是否对使用某种量度定义聚类有疑问,您可以扩展数据(不包括所需的变量),以便该变量具有不同的量度,并且可以影响聚类的结果。