层次聚类算法_层次KMeans聚类(Hierarchical KMeans Clustering)
在分析一组样本及其相关特征时, 我们经常使用的统计方法包括聚类分析, 以识别哪些样本或特征能够被分组. 具体而言, 聚类方法可分为两种: 根据监督信息的方法称为分类; 而无需依赖标签的信息则属于无监督学习范畴. 我们今天将要探讨一种相对简单的无监督学习算法: 层次化K均值聚类(Hierarchical K-Means Clustering).
在讲解HDKmeans聚类算法之前,请先复习相关知识(包括层次聚类(Hierarchical cluster)和k-means聚类的基本概念)。这个过程有助于更好地理解整个算法的工作原理。
层次聚类 :
层次聚类通过反复地将最接近的两个群体进行合并来构建一个层级结构,在这个过程中每个群体均始于单一元素。在每一次迭代中层次聚类算法会计算任意两个现有群体之间的距离并将具有最小距离的那个新形成的群体加入到现有的群体中这一流程会持续进行下去直至所有数据点被整合为一个单独的群体。
假设有N个待聚类的样本,对于层次聚类来说,基本步骤就是:
(初始化阶段)计算不同样本间的相似性,并基于此将具有较高相似度的样本归类。常见的衡量标准包括欧氏距离、皮尔逊相关系数、余弦相似度以及Jaccard指数等指标。(具体代码实现则使用Python语言,并已托管至GitHub存储库中:https://github.com/aiyacharley/VectorDist)
接着,在各类之间寻找最接近的两个类别,并将其归并为一个类别(从而使得总类别数减少一个)。在计算类别间距离时常用的有SingleLinkage、CompleteLinkage和Average-linkage等方法;根据不同的评估标准选择不同的距离指标会带来不同的聚类效果。其中以CompleteLinkage和Average-linkage为主流方法,在实际应用中由于能生成较为均衡的谱系图而被广泛采用。
-
重新计算新生成的这个类与各个旧类之间的相似度;
-
重复2和3直到所有样本点都归为一类,结束。
层次聚类示例如下:

K-means聚类 :
在k-means算法中, 参数k代表最终形成的类别数量. 该参数需要你自行设定.
k-means被认为是相对简单的方法, 在机器学习领域中应用广泛.
基本步骤如下:
-
初始化聚类中心.
-
迭代优化直到收敛.
-
计算数据点到各中心的距离并归类.
-
首先任取(你没看错,就是任取)k个样本点作为k个簇的初始中心;
对每一个样本点而言,在计算其与k个中心点之间的距离后,请将其分配到离它最近的那个中心所属的簇中;
-
等到所有的样本点归类完毕,重新计算k个簇的中心;
-
重复以上过程直至样本点归入的簇不再变动。
k-means聚类示例过程如下:

k-means聚类分析的原理虽然简单,但缺点也比较明显:
首先将数据分成几类,在缺乏足够的信息的情况下,参数k的值也需要自行确定。
-
初始中心也要自己选,而这个初始中心直接决定最终的聚类效果;
-
每一次迭代都要重新计算各个点与中心的距离,然后排序,时间成本较高。
值得注意的是,在计算相似性时存在多种不同的方法,并非必须依赖于欧氏距离;对数据进行标准化处理时采用了归一化算法(该算法的具体实现可参考GitHub仓库https://github.com/aiyacharley/VectorDist)。
既然我们已经掌握了层次聚类和k-means聚类的核心概念,接下来我们将深入探讨层次聚类中的高级K均值聚类方法(hkmeans)。
层次K-means聚类是将层次聚类与K-means聚类相结合而形成的优化算法
hkmeans算法基本步骤如下:
-
层次聚类并将树切成k个簇;
-
计算k个簇的中心(比如均值或中位数);
-
计算每个样本到k个簇中心的距离,所有样本重新分类到k簇中;
-
重复步骤2,最终直至样本点归入的簇不再变动;
hkmeans的优点:
- 相比k-means算法,hkmeans初始中心是由层次聚类得到,会更加合理;
具体实现过程(R语言)
安装并调用R包factoextra
install.packages(“factoextra”) # 安装一次即可library(‘factoextra’)
加载数据(这里用R自带的标准数据集USArrest)
df
指定参数
# Compute hierarchical k-means clustering# 参数hc.metric指定层次聚类计算向量间距离算法# 参数hc.method指定层次聚类计算类间聚类算法# 参数km.algorithm指定kmeans算法# 参数iter.max指定k-means允许的最大迭代次数res.hk "euclidean", hc.method =
可视化层次聚类的谱系树图
# Visualize the treefviz_dend(res.hk, cex = 0.6, palette = "jco", rect = TRUE, rect_border = "jco", rect_fill = TRUE)

可视化最终的聚类结果
# Visualize the hkmeans final clusters fviz_cluster(res.hk, palette = "jco", repel = TRUE, ggtheme = theme_classic())

写在最后~
聚类算法既无绝对的好坏之分,在实际应用中需根据具体需求进行选择,在这一过程中我们需要深入理解数据特征才能找到适合的数据处理方式,并对数据进行预处理以提高分析效果
今天就这样,peace & love
