首页 > 其他分享 >层次聚类——以凝聚型层次聚类为例讲解(易懂版)

层次聚类——以凝聚型层次聚类为例讲解(易懂版)

时间:2024-11-17 15:15:30浏览次数:3  
标签:层次 树状 为例 合并 距离 聚类 数据

        层次聚类是一种将数据集逐步划分为层次结构的方法,是一种无监督学习方法最终形成一颗树状图(dendrogram),可以直观地表示不同数据点之间的聚类关系。它是一种无监督学习方法。

层次聚类的两种方法

  1. 凝聚型(自底向上):这是最常见的方法,从每个数据点开始,将它们作为单独的簇。然后,逐步合并最相似的簇,直到所有数据点都被合并成一个簇,或者达到设定的停止条件。

  2. 分裂型(自顶向下):与凝聚型相反,分裂型聚类从整个数据集开始,然后将其分割成更小的簇,逐步细分,直到每个簇只包含一个数据点或达到某个停止条件。

这里,我们详细讲解凝聚型层次聚类的原理。

凝聚型层次聚类

距离度量方法:

  • 欧氏距离:是最常见的距离度量,用于度量两点之间的直线距离,常见于低维数据,尤其适用于球形簇结构。

  • 曼哈顿距离:是另一个常用的距离度量,适合于矩形格局的数据(如网格结构的数据),计算的是两点在坐标轴上的绝对距离之和。

  • 其他距离度量:如余弦相似度、马氏距离等,也可以在不同的应用场景中替代欧氏距离。

后文均以欧氏距离讲解。

聚合准则(合并策略):

  • 单链聚类: 在此方法中,两个簇之间的距离是簇中任意两个点之间的最小距离:

    这种方法容易受到离群点的影响。

  • 全链聚类: 在此方法中,两个簇之间的距离是簇中任意两个点之间的最大距离:

    这种方法产生的簇较为紧凑,较不容易出现离群点。

  • 均值链接: 计算簇之间所有点对的平均距离:

    这种方法是单链和全链的折中。

  • Ward法: 该方法基于簇内的方差来判断合并的方式,目标是最小化每次合并所增加的方差。两个簇合并后,新的簇的总方差是最小的。对于两个簇 A 和 B,计算合并后的簇的总方差,其公式为:

        

主要步骤:

  1. 计算所有数据点之间的欧式距离。

  2. 将每个数据点作为一个独立的簇。

  3. 计算簇间的距离(相似度),合并距离最近(最相似)的两个簇。(贪心算法)

  4. 重复步骤3,直到所有数据点都合并成一个簇或达到终止条件。

  5. 绘制树状图,观察不同簇合并的层次结构。

树状图可视化:

# 导包
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]

应用场景

  1. 生物信息学: 分析基因表达模式或序列相似性。

  2. 市场细分: 根据客户特征划分客户群。

  3. 文档分类: 根据文档相似性组织文档层次。

  4. 图像分割: 通过像素特征对图像进行分块。

  5. 异常检测: 寻找与其他簇相异的数据点。

层次聚类优缺点:

优点:

  • 直观性强:通过树状图 (dendrogram) 可以清晰地展示数据点的聚类过程,帮助分析数据的层次结构。

  • 可以不用预设簇数:不像 K-means 聚类需要预先指定簇的数量,层次聚类可以通过不同的截断方式调整簇数量。

  • 适用于非球形分布:层次聚类可以处理形状复杂的簇(如长条形或非线性分布),相比 K-means 更加灵活。

  • 适用小数据集:层次聚类在处理小数据集时非常有效,能够生成详细的聚类关系。

  • 支持多种距离度量方法

缺点

  • 计算复杂度高:层次聚类的时间复杂度通常为 O(n^{3}),在大规模数据集上计算量较大。存储复杂度也较高,尤其是在需要保存距离矩阵的情况下。

  • 对噪声和离群点敏感:噪声数据和异常值可能会显著影响聚类结果,导致某些簇的质量下降。

  • 不可逆性:层次聚类是贪心算法,聚类过程中做出的错误决定无法回溯或修正。

  • 难以扩展到大数据集:随着数据量增大,计算距离矩阵和构建树状图的代价过高,导致性能瓶颈。

  • 缺乏优化目标:不像 K-means 或 GMM 聚类有明确的优化目标(如最小化簇内误差平方和),层次聚类的结果可能难以量化和比较。

#  若文章对大噶有帮助的话,希望点个赞支持一下叭!

标签:层次,树状,为例,合并,距离,聚类,数据
From: https://blog.csdn.net/weixin_74268817/article/details/143821824

相关文章

  • 【视频讲解】Python深度神经网络DNNs-K-Means(K-均值)聚类方法在MNIST等数据可视化对比
    全文链接:https://tecdat.cn/?p=38289原文出处:拓端数据部落公众号分析师:CucuSun近年来,由于诸如自动编码器等深度神经网络(DNN)的高表示能力,深度聚类方法发展迅速。其核心思想是表示学习和聚类可以相互促进:好的表示会带来好的聚类效果,而好的聚类为表示学习提供良好的监督信号。关......
  • 从零开始学机器学习——了解聚类
    首先给大家介绍一个很好用的学习地址:https://cloudstudio.net/columns聚类是一种无监督学习方法,其基本假设是数据集未经过标记,或者输入数据与预定义的输出之间并不存在直接的对应关系。聚类的主要目标是将具有相似特征的数据点归类到同一组中,这一组通常被称为“簇”。聚类结果的......
  • 根据二叉树的前序和中序构建树,并按层次输出(C++)vector存树
    L2-006树的遍历#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;#defineendl'\n'intpo[35];intino[35];vector<int>ans[50];intdfs(intl1,intr1,intl2,intr2){ for(inti=l2;i<=r2;i++){ if......
  • 绘制层次结构图
    绘制层次结构图WPS的智能图形要收费,先做个免费的不美观的版本。基于matplotlib,networkx,graphviz,pydot按需修改输入内容input_data为输入的文本。外观rankdir为指定方向。mpatches.Rectangle为节点外形。比例缩放matplotlib窗口,调整节点长宽。调整字体大小,当前为pl......
  • 【鸣潮,原神PC端启动器】仿二次元手游PC端游戏启动器,以鸣潮为例。
    二游GAMELanucher启动器1.前言许多二次元手游(原神,鸣潮,少女前线)的PC端启动器都是使用Qt做的,正好最近正在玩鸣潮,心血来潮,便仿鸣潮启动器,从头写一个。先下载一个官方版的PC启动器,找到图标,背景图等素材,然后对着界面写代码就行。效果如下2.划分模块游戏启动器大致可以......
  • 《认知觉醒》读书笔记:焦虑与不同层次的成长权重
    最近在阅读《认知觉醒》这本书,读到了其中关于焦虑和耐心的那一章,感觉受到了一些启发,在这里分享给大家。书中对于焦虑的本质的描述非常精辟,这里摘录如下:归结起来,焦虑的原因就两条:想同时做很多事,又想立即看到效果。自己的欲望大于能力,又极度缺乏耐心。焦虑就是因为欲望与能......
  • K-Means聚类分析以及误差平方和SSE(Python实现)
    K-means聚类的原理。K-Means算法的目标是将原始数据分为K簇,每一簇都有一个中心点,这也是簇中点的均值点,簇中所有的点到所属的簇的中心点的距离都比到其他簇的中心点更近。K-means聚类的算法流程。1、随机确定K个点作为质心(在本次实验中,我在数据中使用随机数选择了K个点作为初始......
  • 充电桩基础设施的时空大数据分析:以深圳市为例
    随着全球对可持续交通解决方案的需求不断增长,电动汽车(EV)作为减少交通领域碳排放的重要手段,受到了广泛的关注。然而,电动汽车的普及和发展面临着诸多挑战,其中充电基础设施的建设和管理尤为关键。为了更好地理解和解决这些问题,本篇文章利用ST-EVCDP和ST-EVCDP-v2数据集进行深入的......
  • 透视视角下利用depthTest和depthWrite控制物体前后遮挡关系,优化渲染层次感
    https://easyv.cloud/c/article/10206.html二、深度测试(depthTest)深度测试是一种机制,它决定了一个像素是否可见。当一个新的像素需要被绘制时,其深度值会与深度缓冲中的当前值进行比较。根据比较结果的不同,采取不同的行动:小于:如果新像素的深度值小于缓冲区中的值,说明新像素更靠......
  • Linux CPU 拓扑结构之调度域 调度组 - 以8核ARM big.Little架构处理器为例
    CPU拓扑结构简介SMTLevel超线程处理器的一个核心MCLevel多核CPU的一个核心DIELevel一个物理CPU的晶片(注意不是package,package是封装好了的,肉眼看到的CPU处理器)(覆盖系统所有的CPU(CPU0~CPUN))cpu最小级别的就是超线程处理器的一个smt核,次小的一级就是一个多核cpu......