📜  如何使用 R 编程进行层次聚类分析?

📅  最后修改于: 2022-05-13 01:54:22.854000             🧑  作者: Mango

如何使用 R 编程进行层次聚类分析?

聚类分析或聚类是一种在数据集中查找数据点子组的技术。属于同一子组的数据点具有相似的特征或属性。聚类是一种无监督的机器学习方法,具有广泛的应用,例如市场研究、模式识别、推荐系统等。最常用的聚类算法是 K-means 聚类和分层聚类分析。在本文中,我们将了解层次聚类分析及其在 R 编程中的实现。

层次聚类分析(也称为层次聚类)是一种聚类技术,其中聚类具有层次结构或预定顺序。层次聚类可以用称为树状图的树状结构表示。有两种类型的层次聚类:

  • 凝聚层次聚类:这是一种自下而上的方法,其中每个数据点都从自己的集群开始,随着层次结构的向上移动,相似的集群对被合并。
  • 分裂层次聚类:这是一种自上而下的方法,其中所有数据点都从一个集群开始,随着一个人在层次结构中向下移动,集群被递归分割。

为了衡量一对数据点之间的相似性或不相似性,我们使用距离度量(欧几里得距离、曼哈顿距离等)。然而,为了找到两个观测集群之间的差异,我们使用了聚集方法。最常见的聚合方法是:

  • 完全链接聚类:它计算两个聚类中观测值之间的所有成对差异,并将两点之间的最长(最大)距离视为两个聚类之间的距离。
  • 单链聚类:它计算两个聚类中观测值之间的所有成对差异,并将最短(最小)距离视为两个聚类之间的距离。
  • 平均链接聚类:它计算两个聚类中观测值之间的所有成对差异,并将平均距离视为两个聚类之间的距离。

使用 R 执行层次聚类分析

在R中计算层次聚类,常用的函数如下:

  • stats 包中的hclust和 cluster 包中的agnes用于凝聚层次聚类。
  • 用于分裂层次聚类的 cluster 包中的diana

我们将在我们的实现中使用数据集包中的鸢尾花数据集。我们将使用萼片宽度、萼片长度、花瓣宽度和花瓣长度列作为我们的数据点。首先,我们加载并规范化数据。然后使用dist函数计算相异值,并将这些值馈送到聚类函数以执行层次聚类。



R
# Load required packages
library(datasets) # contains iris dataset
library(cluster)  # clustering algorithms
library(factoextra) # visualization
library(purrr) # to use map_dbl() function
  
# Load and preprocess the dataset
df <- iris[, 1:4]
df <- na.omit(df)
df <- scale(df)
  
# Dissimilarity matrix
d <- dist(df, method = "euclidean")


R
# Hierarchical clustering using Complete Linkage
hc1 <- hclust(d, method = "complete" )
  
# Plot the obtained dendrogram
plot(hc1, cex = 0.6, hang = -1)


R
# Cut tree into 3 groups
sub_grps <- cutree(hc1, k = 3)
  
# Visualize the result in a scatter plot
fviz_cluster(list(data = df, cluster = sub_grps))


R
# Plot the obtained dendogram with 
# rectangle borders for k clusters
plot(hc1, cex = 0.6, hang = -1)
rect.hclust(hc1, k = 3, border = 2:4)


R
# agglomeration methods to assess
m <- c("average", "single", "complete")
names(m) <- c("average", "single", "complete")
  
# function to compute hierarchical 
# clustering coefficient
ac <- function(x) {
  agnes(df, method = x)$ac
}
  
map_dbl(m, ac)


R
# Hierarchical clustering 
hc2 <- agnes(df, method = "complete")
  
# Plot the obtained dendogram
pltree(hc2, cex = 0.6, hang = -1, 
       main = "Dendrogram of agnes")


R
# Compute divisive hierarchical clustering
hc3 <- diana(df)
  
# Divise coefficient
hc3$dc
  
# Plot obtained dendrogram
pltree(hc3, cex = 0.6, hang = -1, 
       main = "Dendrogram of diana")


凝聚层次聚类实现

获得的相异矩阵被馈送到hclusthclustmethod参数指定要使用的聚集方法(即完全、平均、单一)。然后我们可以绘制树状图。

电阻

# Hierarchical clustering using Complete Linkage
hc1 <- hclust(d, method = "complete" )
  
# Plot the obtained dendrogram
plot(hc1, cex = 0.6, hang = -1)

输出:

观察到在上面的树状图中,一片叶子对应一个观察,当我们向上移动树时,相似的观察在更高的高度融合。树状图的高度决定了簇。为了识别集群,我们可以用cutree切割树状图。然后使用factoextra包中的fviz_cluster函数在散点图中可视化结果。

电阻

# Cut tree into 3 groups
sub_grps <- cutree(hc1, k = 3)
  
# Visualize the result in a scatter plot
fviz_cluster(list(data = df, cluster = sub_grps))

输出:



我们还可以为 3 个集群周围的树状图提供边界,如下所示。

电阻

# Plot the obtained dendogram with 
# rectangle borders for k clusters
plot(hc1, cex = 0.6, hang = -1)
rect.hclust(hc1, k = 3, border = 2:4)

输出:

或者,我们可以使用agnes函数来执行层次聚类。与hclust不同, agnes函数给出了凝聚系数,该系数衡量发现的聚类结构的数量(接近 1 的值表示强聚类结构)。

电阻

# agglomeration methods to assess
m <- c("average", "single", "complete")
names(m) <- c("average", "single", "complete")
  
# function to compute hierarchical 
# clustering coefficient
ac <- function(x) {
  agnes(df, method = x)$ac
}
  
map_dbl(m, ac)

输出:

average    single  complete 
0.9035705 0.8023794 0.9438858 

完全链接提供了更强的聚类结构。因此,我们使用这种聚集方法来执行具有agnes函数的层次聚类,如下所示。

电阻

# Hierarchical clustering 
hc2 <- agnes(df, method = "complete")
  
# Plot the obtained dendogram
pltree(hc2, cex = 0.6, hang = -1, 
       main = "Dendrogram of agnes")

输出:

分裂聚类实现

函数戴安娜 类似于agnes的工作允许我们执行分裂的层次聚类。但是,没有提供方法

电阻

# Compute divisive hierarchical clustering
hc3 <- diana(df)
  
# Divise coefficient
hc3$dc
  
# Plot obtained dendrogram
pltree(hc3, cex = 0.6, hang = -1, 
       main = "Dendrogram of diana")

输出:

[1] 0.9397208