层次聚类和 k 均值
Hierarchical clustering and k means
我想运行进行层次聚类分析。我知道 hclust() 函数,但不知道如何在实践中使用它;我坚持向函数提供数据并处理输出。
我想聚类给定测量的主要问题。
我还想将层次聚类与 kmeans() 生成的层次聚类进行比较。我再次不确定如何调用此函数或use/manipulate它的输出。
我的数据类似于:
df<-structure(list(id=c(111,111,111,112,112,112), se=c(1,2,3,1,2,3),t1 = c(1, 2, 1, 1,1,3),
t2 = c(1, 2, 2, 1,1,4), t3 = c(1, 0, 0, 0,2,1), t4 = c(2, 5, 7, 7,1,2),
t5 = c(1, 0, 1, 1,1,1),t6 = c(1, 1, 1, 1,1,1), t7 = c(1, 1, 1 ,1,1,1), t8=c(0,0,0,0,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[,-1]),method='complete')
第三种方法是单一距离,计算所有点的所有距离的最小值:
#Method 3
hc.single <- hclust(dist(df[,-1]),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
。
关于您对使用某种度量来定义聚类的疑问,您可以缩放您的数据,不包括所需的变量,以便该变量具有不同的度量,并且可以影响您的聚类结果。
我想运行进行层次聚类分析。我知道 hclust() 函数,但不知道如何在实践中使用它;我坚持向函数提供数据并处理输出。
我想聚类给定测量的主要问题。
我还想将层次聚类与 kmeans() 生成的层次聚类进行比较。我再次不确定如何调用此函数或use/manipulate它的输出。
我的数据类似于:
df<-structure(list(id=c(111,111,111,112,112,112), se=c(1,2,3,1,2,3),t1 = c(1, 2, 1, 1,1,3),
t2 = c(1, 2, 2, 1,1,4), t3 = c(1, 0, 0, 0,2,1), t4 = c(2, 5, 7, 7,1,2),
t5 = c(1, 0, 1, 1,1,1),t6 = c(1, 1, 1, 1,1,1), t7 = c(1, 1, 1 ,1,1,1), t8=c(0,0,0,0,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[,-1]),method='complete')
第三种方法是单一距离,计算所有点的所有距离的最小值:
#Method 3
hc.single <- hclust(dist(df[,-1]),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
。
关于您对使用某种度量来定义聚类的疑问,您可以缩放您的数据,不包括所需的变量,以便该变量具有不同的度量,并且可以影响您的聚类结果。