目录
1. 引言与背景
层次聚类(Hierarchical Clustering)是一种重要的无监督机器学习聚类方法,它通过构建一棵层次分明的聚类树(Dendrogram),以递归方式将数据点逐步合并或分割,从而揭示数据内在的层次结构和相似性关系。层次聚类最初由Jardine和Sibson于上世纪60年代提出,至今已发展成为一种广泛应用的数据挖掘和数据分析技术,广泛应用于生物学、社会学、市场分析、图像处理等领域。
2. 层次聚类定理
层次聚类的核心定理并不像其他算法那样明确地定义一个定理,但它的核心思想在于利用距离或相似度矩阵,通过构建聚类树来表示数据点之间的层次关系。聚类树的构建可以通过两种主要策略:凝聚式聚类(Agglomerative Clustering)和分裂式聚类(Divisive Clustering)。凝聚式聚类从每个数据点作为一个单独的簇开始,然后逐渐合并距离最近或相似度最高的簇,直至所有数据点被合并为一个簇;分裂式聚类则相反,从包含所有数据点的单一簇开始,逐渐将其细分为多个更小的簇。
3. 算法原理
层次聚类主要有两大类方法:
-
凝聚式聚类:该方法首先将每个数据点视为一个单独的簇,然后在每一步中,找出距离最近的两个簇进行合并,直到所有数据点都被合并到一个簇为止。常用的凝聚策略有单链接(Single Linkage)、全链接(Complete Linkage)、平均链接(Average Linkage)和 ward方法等。
-
分裂式聚类:这种方法从整体出发,首先将所有数据点视为一个簇,然后在每一步中,将当前簇中最分散的部分拆分成两个子簇,重复此过程直至满足终止条件。
4. 算法实现
在Python的机器学习库scikit-learn中,层次聚类的实现如下:
Python代码实现
from sklearn.cluster import AgglomerativeClustering
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
import scipy.cluster.hierarchy as sch
# 创建模拟数据集
X, _ = make_blobs(n_samples=100, n_features=2, centers=3, random_state=42)
# 应用凝聚式聚类
agg_clustering = AgglomerativeClustering(n_clusters=3, affinity='euclidean', linkage='ward')
agg_labels = agg_clustering.fit_predict(X)
# 绘制聚类结果
plt.scatter(X[:, 0], X[:, 1], c=agg_labels)
plt.title('Agglomerative Clustering')
# 生成并绘制层次聚类树(Dendrogram)
dendrogram = sch.dendrogram(sch.linkage(X, method='ward'))
plt.title('Dendrogram')
plt.show()
这段代码实现了使用Python的scikit-learn库进行层次聚类的过程,并可视化了聚类结果和层次聚类树(Dendrogram)。以下是代码逐行解析:
-
导入所需库:
sklearn.cluster.AgglomerativeClustering
:这是scikit-learn中实现凝聚式层次聚类的类。sklearn.datasets.make_blobs
:用于生成模拟的二维球状数据集,便于演示聚类效果。matplotlib.pyplot
:用于数据可视化,画出散点图展示聚类结果。scipy.cluster.hierarchy
:其中包含了计算层次聚类所需的linkage方法和绘制Dendrogram的方法。
-
使用
make_blobs
创建了一个模拟数据集,包含100个样本,每个样本具有2个特征,数据集中有3个中心点(即3个潜在簇),并通过random_state=42
确保每次运行生成相同的数据分布。 -
初始化
AgglomerativeClustering
实例,设置聚类数量为3,相似性度量方法为欧氏距离(affinity='euclidean'),合并策略为Ward方法(linkage='ward')。Ward方法试图使得合并过程中形成的簇内平方误差和最小。 -
应用聚类模型到数据集上,通过
fit_predict
方法找到每个样本所属的簇,并将预测结果存储在agg_labels
变量中。 -
使用matplotlib绘制散点图,展示了聚类后的结果。颜色编码代表了每个样本所归属的簇。
-
使用
scipy.cluster.hierarchy.linkage
计算层次聚类的连接矩阵,这里同样采用Ward方法。之后,调用sandogram
函数绘制Dendrogram,这是一棵树状图,直观反映了样本或者簇之间的合并历史。 -
设置图表标题为'Dendrogram'。
-
显示绘制好的图形,包括散点图(聚类结果)和层次聚类树。
执行这段代码后,将看到两个窗口分别显示了数据点经过层次聚类后的分类情况以及层次聚类树。通过观察Dendrogram可以了解到数据点是如何一步步聚合成最终的簇的。
5. 优缺点分析
-
优点:
- 层次聚类能够揭示数据集的层次结构,有助于理解数据内在关系。
- 无需预先设定聚类数目,可以根据Dendrogram裁剪得到不同粒度的聚类结果。
- 对于球形簇和非凸簇都能较好处理。
-
缺点:
- 对于大规模数据集,计算复杂度较高,运行速度慢。
- 对于不同类型的链接策略,选择不当可能造成聚类效果不佳。
- 对于噪声和异常值敏感,可能导致聚类结果受其影响。
6. 案例应用
层次聚类在多个领域都有广泛的应用,例如:
- 生物信息学:用于基因表达数据的聚类分析,揭示基因的功能关联和调控网络。
- 社交网络分析:用于发现社交网络中的社群结构。
- 电子商务:用于顾客细分,根据购物习惯和偏好对客户进行分群。
7. 对比与其他算法
-
与K-means对比:K-means要求预先设定聚类数目,且只能处理凸形状的簇,而层次聚类无此限制。然而,K-means在处理大规模数据时效率更高,且更容易解释和实施。
-
与DBSCAN对比:DBSCAN能发现任意形状的簇并识别噪声点,但层次聚类更能反映数据的层次结构。DBSCAN对参数敏感,而层次聚类的聚类结果可通过Dendrogram直观查看。
8. 结论与展望
层次聚类作为无监督学习中的一项经典技术,其在揭示数据层次结构和发现隐含模式方面的优势不容忽视。尽管在处理大规模数据集时面临效率挑战,但随着计算技术和算法优化的发展,层次聚类方法仍在不断进步和完善。未来的研究重点可能会放在优化大规模数据集上的计算效率,以及结合深度学习等先进技术提高聚类质量。同时,层次聚类在多模态数据融合、时空数据聚类等新场景下的应用也值得深入探索。