层次聚类——以凝聚型层次聚类为例讲解(易懂版)
创作时间:
作者:
@小白创作中心
层次聚类——以凝聚型层次聚类为例讲解(易懂版)
引用
CSDN
1.
https://blog.csdn.net/weixin_74268817/article/details/143821824
层次聚类是一种将数据集逐步划分为层次结构的方法,是一种无监督学习方法最终形成一颗树状图(dendrogram),可以直观地表示不同数据点之间的聚类关系。它是一种无监督学习方法。
层次聚类的两种方法
- 凝聚型(自底向上):这是最常见的方法,从每个数据点开始,将它们作为单独的簇。然后,逐步合并最相似的簇,直到所有数据点都被合并成一个簇,或者达到设定的停止条件。
- 分裂型(自顶向下):与凝聚型相反,分裂型聚类从整个数据集开始,然后将其分割成更小的簇,逐步细分,直到每个簇只包含一个数据点或达到某个停止条件。
这里,我们详细讲解凝聚型层次聚类的原理。
凝聚型层次聚类
距离度量方法:
- 欧氏距离:是最常见的距离度量,用于度量两点之间的直线距离,常见于低维数据,尤其适用于球形簇结构。
- 曼哈顿距离:是另一个常用的距离度量,适合于矩形格局的数据(如网格结构的数据),计算的是两点在坐标轴上的绝对距离之和。
- 其他距离度量:如余弦相似度、马氏距离等,也可以在不同的应用场景中替代欧氏距离。
后文均以欧氏距离讲解。
聚合准则(合并策略):
- 单链聚类: 在此方法中,两个簇之间的距离是簇中任意两个点之间的最小距离:
这种方法容易受到离群点的影响。 - 全链聚类: 在此方法中,两个簇之间的距离是簇中任意两个点之间的最大距离:
这种方法产生的簇较为紧凑,较不容易出现离群点。 - 均值链接: 计算簇之间所有点对的平均距离:
这种方法是单链和全链的折中。 - Ward法: 该方法基于簇内的方差来判断合并的方式,目标是最小化每次合并所增加的方差。两个簇合并后,新的簇的总方差是最小的。对于两个簇 A 和 B,计算合并后的簇的总方差,其公式为:
主要步骤:
- 计算所有数据点之间的欧式距离。
- 将每个数据点作为一个独立的簇。
- 计算簇间的距离(相似度),合并距离最近(最相似)的两个簇。(贪心算法)
- 重复步骤3,直到所有数据点都合并成一个簇或达到终止条件。
- 绘制树状图,观察不同簇合并的层次结构。
树状图可视化:
# 导包
import numpy as np
from scipy.cluster.hierarchy import linkage, dendrogram, fcluster
import matplotlib.pyplot as plt
# 创建示例数据
np.random.seed(42)
data = np.random.rand(10, 2) # 10个样本,2个特征
# Ward聚类准则为例,进行层次聚类
linkage_matrix = linkage(data, method='ward')
# 3. 绘制树状图(Dendrogram)
plt.figure(figsize=(8, 4))
dendrogram(linkage_matrix)
plt.title('Dendrogram')
plt.xlabel('Sample Index')
plt.ylabel('Distance')
plt.show()
树状图怎么看?
这样看,第2个和第7个样本点,他们距离最近,合并为同一簇,接着到3和5,合并为同一簇,...。整一个树状图为一个由所以样本点构成的簇,我们根据需要进行划分为k个簇。比如我们在distance=1.1这里截断树状图,那么就划分为035,2789617两个簇;如果在distance=0.7这里截断树状图,就可以划分为035,2789,614三个簇。我们一般选择距离差较大的来划分,比如1.2和0.4之间相差很大,我们需要从这里截断。截断处理一般通过设置一个阈值实现,比如0.5,两个簇之间的距离超过0.5这个阈值就截断,即不再进行合并簇。
簇的数量的选择
情况1(固定需求):如果我们任务需求已经确定要分为3个类别,就直接将簇的数量设置为3个簇,不需要可视化树状图,默认按最佳划分直接得出分类结果。
情况2(不知道分几类):我们不知道要分为几个类别时,就需要根据树状图分析,选择合适的阈值进行划分。
我们看代码实现:
# 或根据指定的簇数量分割(情况1)
num_clusters = 2
labels_by_cluster = fcluster(linkage_matrix, t=num_clusters, criterion='maxclust')
# 根据距离阈值分割(情况2)
threshold = 0.5
labels = fcluster(linkage_matrix, t=threshold, criterion='distance')
# 输出聚类结果
print("基于簇数量的聚类结果:", labels_by_cluster)
print("基于距离阈值的聚类结果:", labels)
# 输出如下:
# 基于簇数量的聚类结果: [1 2 2 1 2 1 2 2 2 2]
# 基于距离阈值的聚类结果: [1 3 2 1 3 1 4 2 2 2]
应用场景
- 生物信息学: 分析基因表达模式或序列相似性。
- 市场细分: 根据客户特征划分客户群。
- 文档分类: 根据文档相似性组织文档层次。
- 图像分割: 通过像素特征对图像进行分块。
- 异常检测: 寻找与其他簇相异的数据点。
层次聚类优缺点:
优点:
- 直观性强:通过树状图 (dendrogram) 可以清晰地展示数据点的聚类过程,帮助分析数据的层次结构。
- 可以不用预设簇数:不像 K-means 聚类需要预先指定簇的数量,层次聚类可以通过不同的截断方式调整簇数量。
- 适用于非球形分布:层次聚类可以处理形状复杂的簇(如长条形或非线性分布),相比 K-means 更加灵活。
- 适用小数据集:层次聚类在处理小数据集时非常有效,能够生成详细的聚类关系。
- 支持多种距离度量方法
缺点:
- 计算复杂度高:层次聚类的时间复杂度通常为
,在大规模数据集上计算量较大。存储复杂度也较高,尤其是在需要保存距离矩阵的情况下。 - 对噪声和离群点敏感:噪声数据和异常值可能会显著影响聚类结果,导致某些簇的质量下降。
- 不可逆性:层次聚类是贪心算法,聚类过程中做出的错误决定无法回溯或修正。
- 难以扩展到大数据集:随着数据量增大,计算距离矩阵和构建树状图的代价过高,导致性能瓶颈。
- 缺乏优化目标:不像 K-means 或 GMM 聚类有明确的优化目标(如最小化簇内误差平方和),层次聚类的结果可能难以量化和比较。
热门推荐
IMAX、杜比、CINITY、巨幕...到底有啥区别?
英雄想象:日本浮世绘中的刘备形象
白醋:家中除蚁的天然神器
使用WiFi 7对手机有哪些具体要求?
药物服用后导致体重增加应如何减肥
鸭浆膜炎的症状、图片及特效药,鸭养殖户快收藏起来!
燕麦片种类很多,糖友4种别碰,2种适合吃
江姓的来源和历史,江姓祖籍在哪里?
平江浯口古镇江氏宗祠:见证700年家族传承
王者荣耀铠英雄图鉴-皮肤/出装/铭文/技能加点/连招推荐
企业消防培训是必须的吗
肥胖的四大元凶曝光!远离这些风险,轻松拥有健康苗条身材
黑米和小米煮粥的最佳搭配食材
1.8亿吨!我国首批页岩油探明储量审核通过 中国石化新兴、溱潼油田诞生
蛋白表达系统的维护保养指南
垂体瘤手术后难受吗?术后脑部出血怎么办?
夏季空调省电指南:合理温度设置与维护技巧
车间安装工业节能空调的要求是什么
黄焖鸡烹饪技巧与营养分析
脑血栓急性期治疗
【机器学习】生成对抗网络(GAN)——生成新数据的神经网络
宁夏工商职业技术学院专业好不好?毕业生工作稳定,待遇好!
跨界军政商,成传奇人物,从范蠡身上能学到哪些成功之道
爱丽舍座椅改装:哪种材质最舒适?
牛肉的每个部位味道不一样,不同的牛肉做法应该挑选哪个部位?
着力解决区域参保群众关注的急难愁盼问题 京津冀医保协同发展成效持续显现
燃气热水器选购指南:一级能效 vs 二级能效,哪个更划算?
什么是爵士乐?它与摇滚乐有什么区别?
什么是生肖及八字命理图解(揭秘生肖与八字命理:命运密码大解析)
运动后检查尿常规会不会有影响