层次聚类法的优点包括能够揭示数据集的层次结构,有助于理解数据内在关系,无需预先设定聚类数目,并且可以通过树状图直观地裁剪得到不同粒度的聚类结果。然而,层次聚类的不足之处在于算法的时间复杂度大,结果依赖聚类的合并点和分裂点的选择,且层次聚类过程是不可逆的,一旦聚类结果形成,想要重新合并来优化聚类的性能是不可能的。因此,在应用层次聚类法时,需要根据数据的特性和聚类的目标仔细选择合适的链接方法和参数。
层次聚类法在多种问题中表现出其独特的优势,尤其适用于以下场景:
-
小样本数据的聚类:层次聚类适合处理小规模数据集,因为它可以形成类相似度层次图谱,便于直观地确定类之间的划分。这种聚类方法可以得到较理想的分类,尤其是当数据集的大小不足以应用其他更复杂的聚类算法时。
-
数据探索和模式识别:在没有先验经验的背景下,层次聚类可以用于探索性分析,帮助识别数据中的模式和结构。
-
市场细分和客户细分:在市场研究中,层次聚类可以用来将客户按照购买行为和偏好进行分类,以便更好地理解客户需求和市场趋势。
-
生物信息学和基因表达数据分析:层次聚类在生物信息学中用于基因表达数据的分析,帮助揭示不同基因之间的相似性和差异性。
-
图像分割和纹理分析:在图像分析中,层次聚类可以用于图像分割成不同的区域或对象,以及纹理分析和形状识别等。
-
任意形状聚类的识别:层次聚类适用于任意形状的聚类,并且对样本的输入顺序是不敏感的。它能够处理非凸形状的簇和大小差别很大的簇。
-
数据预处理:在样本量较大的情况下,层次聚类可以用于数据预处理工作,尤其是在聚类分析无法提供明确的行动指向时,聚类结果更多是为后期挖掘和分析工作提供处理和参考。
-
社交网络分析:层次聚类可以用于发现社交网络中的社群结构,帮助分析社交网络中的连接和群体。
层次聚类不需要事先指定聚类的数量,而是生成一个由层次结构组成的聚类树(称为树状图或dendrogram)。层次聚类主要分为两种类型:凝聚型(Agglomerative)和分裂型(Divisive)。
凝聚型层次聚类(Agglomerative Hierarchical Clustering)
凝聚型层次聚类是一种自底向上的方法,它从每个数据点作为单独的聚类开始,逐步将最近的聚类合并,直到所有数据点都合并成一个大的聚类,或者达到某个停止条件。
步骤如下:
-
初始化:将每个数据点视为一个单独的聚类。
-
计算距离:计算所有聚类之间的距离。常用的距离度量方法包括:
- 单链接(Single Linkage):两个聚类之间的最小距离。
- 完全链接(Complete Linkage):两个聚类之间的最大距离。
- 平均链接(Average Linkage):两个聚类中所有点对的平均距离。
- Ward's 方法:最小化聚类内的方差,即两个聚类合并后总的方差增加最小。
-
合并聚类:选择距离最近的两个聚类进行合并。
-
更新距离矩阵:合并后,更新聚类间的距离矩阵。
-
重复步骤2-4:直到所有数据点都合并成一个聚类,或者达到预设的聚类数量。
-
生成树状图:通过记录每次合并的聚类和距离,可以生成一个树状图来展示聚类的层次结构。
分裂型层次聚类(Divisive Hierarchical Clustering)
分裂型层次聚类是一种自顶向下的方法,它从所有数据点作为一个大的聚类开始,逐步将聚类分裂成更小的聚类。
步骤如下:
-
初始化:将所有数据点作为一个大的聚类。
-
选择聚类:选择一个聚类进行分裂。通常选择具有最大直径(最远点对距离)或最大方差的聚类。
-
分裂聚类:将选定的聚类分裂成两个子聚类。分裂的方式可以是垂直于最大方差的方向,或者基于某种距离度量。
-
更新聚类集合:将分裂后的子聚类加入到聚类集合中。
-
重复步骤2-4:直到每个聚类只包含一个数据点,或者达到预设的聚类数量。
-
生成树状图:通过记录每次分裂的聚类,可以生成一个树状图来展示聚类的层次结构。
凝聚型层次聚类:
% X是一个包含数据点的矩阵,每行代表一个数据点,每列代表一个特征
X = rand(10, 3); % 随机生成10个数据点,每个数据点有3个特征
% 使用linkage函数进行层次聚类
% 'ward'是链接方法,也可以使用'single', 'complete', 'average'等
Z = linkage(X, 'ward');
% 使用dendrogram函数绘制树状图
figure;
dendrogram(Z);
title('层次聚类树状图');
xlabel('数据点');
ylabel('距离');
% 如果你想将数据点划分为K个聚类,可以使用cluster函数
K = 3; % 假设我们想将数据分为3个聚类
clusters = cluster(Z, 'maxclust', K);
% 可视化聚类结果
figure;
gscatter(X(:,1), X(:,2), clusters);
title('层次聚类结果');
xlabel('特征1');
ylabel('特征2');
在这个例子中,我们首先生成了一个随机的数据矩阵X
,然后使用linkage
函数和ward
方法进行层次聚类。linkage
函数返回一个矩阵Z
,它包含了构建树状图所需的所有信息。
接下来,我们使用dendrogram
函数来绘制树状图,它展示了数据点是如何逐步合并成聚类的。
最后,我们使用cluster
函数将数据点划分为K
个聚类,并使用gscatter
函数可视化聚类结果。在这个例子中,我们假设我们想要将数据点划分为3个聚类。
请注意,这个例子使用了随机生成的数据,你可以替换X
为你自己的数据集来执行层次聚类。此外,你可以根据需要选择不同的链接方法和其他参数。