如何使用 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")
凝聚层次聚类实现
获得的相异矩阵被馈送到hclust 。 hclust的method参数指定要使用的聚集方法(即完全、平均、单一)。然后我们可以绘制树状图。
电阻
# 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