R语言 如何使用R编程进行分层聚类分析

R语言 如何使用R编程进行分层聚类分析

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

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

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

为了衡量一对数据点之间的相似性或不相似性,我们使用距离测量(欧氏距离、曼哈顿距离等)。然而,为了找到两组观察值之间的不相似性,我们使用聚类方法。最常见的聚类方法是。

  • 完全联系聚类 :它计算两个聚类中观测值之间的所有成对异同,并将两点之间最长(最大)的距离视为两个聚类之间的距离。
  • 单一联系聚类 :它计算两个聚类中的观测值之间的所有成对异同,并将最短(最小)的距离视为两个聚类之间的距离。
  • 平均联系聚类 :它计算两个聚类中的观测值之间的所有成对的不相似性,并将平均距离作为两个聚类之间的距离。

使用R 执行 层次聚类分析

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

  • 统计包中的 hclust 和cluster包中的 agnes 用于聚类层次聚类。
  • cluster包中的 diana 用于划分层次聚类。

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

# 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")
Bash

聚合分层聚类的实现

获得的异质性矩阵被送入 hclust . hclust 的方法参数指定了要使用的聚类方法(即完全、平均、单一)。然后我们可以绘制树状图。

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

输出

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

请注意,在上述树状图中,一片叶子对应一个观测值,随着我们在树上的移动,类似的观测值会在更高的高度被融合。树状图的高度决定了聚类。为了识别聚类,我们可以用 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))
Bash

输出

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

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

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

输出

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

另外,我们可以使用 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)
Bash

输出

 average    single  complete 
0.9035705 0.8023794 0.9438858 
Bash

完整的联结能带来更强的聚类结构。因此,我们使用这种聚集方法,用 agnes 函数进行分层聚类,如下图所示。

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

输出

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

分割式聚类的实现

与agnes工作类似的函数diana允许我们进行分割式分层聚类。然而,没有方法提供。

# 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")
Bash

输出

[1] 0.9397208
Bash

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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册