聚类算法之层次聚类(Hierarchical Clustering)

注意:本文引用自专业人工智能社区Venus AI

更多AI知识请参考原站 ([www.aideeplearning.cn])

层次聚类是一种非常独特和强大的聚类方法,与众多其他的聚类技术相比,它不仅为数据集提供了一个划分,还给出了一个层次结构,这在某些应用中是非常有价值的。在生物信息学、社会网络分析、市场研究等领域,层次聚类方法被广泛采用,因为它们能够揭示数据的深层结构和关系。

DALL·E 2023-11-22 14.23.51 - Illustration of a hierarchical clustering dendrogram in a 6x5 format. This wide graph should depict a tree-like structure with branches connecting var

1. 算法解读:

层次聚类是一种树形方法,旨在建立一个分层的聚类结构。这种结构通常呈现为一个称为“树状图”(Dendrogram)的树形图,其中数据的每一项都位于树的叶子上,然后通过不断地合并或分裂,最终形成一个树形的聚类层次。

2. 步骤和细节:

凝聚型 (Agglomerative):

开始: 每个数据点都是一个聚类,因此有N个聚类(其中N是数据点的数量)。

迭代:在每一步,找到最近的两个聚类并合并它们,因此聚类的数量减少一个。

结束:最后只剩下一个包含所有数据点的聚类。

分裂型 (Divisive):

开始: 所有数据点都属于一个大的聚类。

迭代:在每一步,选择一个聚类并将其分割为两个子聚类。

结束:最后每个数据点都成为自己的聚类。

3. 举例:

假设我们有四种不同的物种:A、B、C和D,我们已经测量了它们在某些条件下的基因表达水平。我们的目标是使用层次聚类来探索这些物种之间的相似性,并了解它们之间的进化关系。

考虑我们有以下物种的基因表达数据:

物种A:[1, 2, 3]

物种B:[2, 3, 4]

物种C:[5, 6, 7]

物种D:[8, 9, 10]

我们希望基于这些基因表达数据来理解这四个物种之间的相似性。

凝聚性的流程如下:

步骤1:开始时,每个物种都被视为一个单独的聚类,即我们有四个聚类:{A}、{B}、{C}和{D}。

步骤2:计算每对聚类之间的距离。在这个例子中,我们可以计算每对物种基因表达数据之间的欧几里得距离。找到距离最近的两个聚类,并将它们合并为一个新的聚类。假设物种A和物种B的距离最近,我们将它们合并为一个新的聚类{A, B}。现在我们有三个聚类:{A, B}、{C}和{D}。

步骤3:继续计算新聚类与其他聚类之间的距离,并合并距离最近的两个聚类。假设{A, B}和{C}之间的距离最近,我们将它们合并为一个新的聚类{A, B, C}。现在我们有两个聚类:{A, B, C}和{D}。

步骤4:最后,我们将剩下的两个聚类{A, B, C}和{D}合并为一个聚类{A, B, C, D}。

通过这个过程,我们构建了一个树状图(Dendrogram),展示了这四个物种之间的相似性和层次结构,从而帮助我们理解它们的进化关系。

分裂性的流程如下:

步骤1:开始时,所有物种都属于一个大的聚类,即我们有一个聚类:{A, B, C, D}。

步骤2:选择一个聚类并将其分裂为两个子聚类。在这个例子中,我们可以使用一种方法(如k-means聚类)来确定如何将大聚类分裂。假设我们将{A, B, C, D}分裂为两个聚类:{A, B}和{C, D}。

步骤3:继续选择一个聚类并将其分裂。例如,我们可以进一步将{A, B}分裂为两个聚类:{A}和{B},同时,将{C, D}分裂为两个聚类:{C}和{D}。

步骤4:最后,每个物种都成为自己的聚类,即我们得到四个聚类:{A}、{B}、{C}和{D}。

通过这个过程,我们同样构建了一个树状图(Dendrogram),展示了这四个物种之间的相似性和层次结构,帮助我们理解它们的进化关系,但是这次是通过分裂的方式进行的。

代码示例:

我们可以使用Python的scipy库来演示层次聚类的凝聚型和分裂型方法。下面是一个简单的代码示例,展示了如何使用这两种方法进行层次聚类。

我们将演示凝聚型层次聚类:

import numpy as np

from scipy.cluster.hierarchy import dendrogram, linkage, cut_tree

import matplotlib.pyplot as plt

# 定义基因表达数据

data = np.array([

    [1, 2, 3],  # 物种A

    [2, 3, 4],  # 物种B

    [5, 6, 7],  # 物种C

    [8, 9, 10]  # 物种D

])

# 使用“ward”方法进行凝聚型层次聚类

linked = linkage(data, 'ward')

# 绘制树状图

plt.figure(figsize=(10, 7))

dendrogram(linked, labels=['A', 'B', 'C', 'D'])

plt.title('Agglomerative Hierarchical Clustering Dendrogram')

plt.xlabel('Species')

plt.ylabel('Euclidean distances')

plt.show()

4. 算法评价:

优点:

动态聚类数:不需要预先指定聚类数,可以根据树状图切割得到任意数量的聚类。

解释性:通过层次结构,研究者可以更加直观地看到数据的层次和结构,从而获得更深入的洞察。

缺点:

计算复杂度:尤其是凝聚型方法,随着数据点数量的增加,计算复杂度急剧上升。

大数据集不友好:由于其高计算复杂度,不推荐在大数据集上使用。

5. 算法的变体:

凝聚型 (Agglomerative):

凝聚型层次聚类有多种变体,这些变体主要基于不同的距离度量方法和链结标准来定义。以下是一些常见的变体:

最近邻链结(Single Linkage):

定义:最近邻链结法中,两个聚类之间的距离被定义为这两个聚类中最近两个点之间的距离。

优点:能够处理非球形的聚类和不同大小的聚类。

缺点:对噪声和异常点敏感,容易产生链状效应。

最远邻链结(Complete Linkage):

定义:最远邻链结法中,两个聚类之间的距离被定义为这两个聚类中最远两个点之间的距离。

优点:能够较好地处理噪声和异常点,减少链状效应。

缺点:倾向于生成大小相近的聚类,可能会忽略真实的聚类结构。

平均链结(Average Linkage):

定义:平均链结法中,两个聚类之间的距离被定义为这两个聚类中所有点对之间距离的平均值。

优点:综合了最近邻链结和最远邻链结的优点,适用于多种类型的数据集。

缺点:计算复杂度相对较高。

Ward链结(Ward’s Method):

定义:Ward链结法中,两个聚类合并后产生的方差增加值被用作这两个聚类之间的距离。

优点:通常能够生成较为均匀大小的聚类。

缺点:可能会忽略不同大小的真实聚类结构。

分裂型 (Divisive):

分裂型层次聚类较少使用,但在某些特定的应用中可能更有优势。其变体主要基于如何选择待分裂的聚类和如何进行分裂:

基于直径的分裂:

定义:选择直径(最远内部点之间的距离)最大的聚类进行分裂。

应用:适用于当聚类的直径差异较大时。

基于密度的分裂:

定义:选择点的密度(例如,点的数量或平均距离)最低的聚类进行分裂。

应用:适用于当聚类的密度差异较大时。

分裂型层次聚类虽然较少使用,但在特定应用中有其独特优势。例如,在生物信息学中,分裂型方法可用于基于基因表达模式的样本分类。此外,分裂型和凝聚型层次聚类可以相互补充,在某些情况下,结合使用这两种方法可能会得到更好的聚类结果。

与其他聚类算法的比较:

层次聚类与如k-means聚类等其他非层次聚类算法相比,有其独特之处。层次聚类不需要预先指定聚类数目,能够直观地通过树状图展示数据的层次结构,适合于探索性数据分析。但是,层次聚类的计算复杂度通常较高,可能不适合于大规模数据集。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/474230.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙APP应用开发教程—超详细的项目结构说明

1. 新建项目 打开DevEco Studio, 选择 Create Project: 1.1 选择模版 Create Project - Choose Template 1.2 配置项目 Create Project - Configure Project 如果使用的是 DevEco 3.X 版本, 可以根据 Compile SDK版本选择不同的模式, 比如: 3.0.0(API 8)及更早 - 仅支持 …

【数据结构】堆和树详解堆和二叉树的实现堆的top-k问题

主页:醋溜马桶圈-CSDN博客 专栏:数据结构_醋溜马桶圈的博客-CSDN博客 gitee:mnxcc (mnxcc) - Gitee.com 目录 1.树概念及结构 1.1 树的概念 2.2 树的相关概念 1.3 树的表示 1.4 树在实际中的运用 2.二叉树的概念及结构 2.1 二叉树的概念…

力扣389周赛复盘

字符串及其反转中是否存在同一子字符串 class Solution {public boolean isSubstringPresent(String s) {StringBuilder sb new StringBuilder(s);String reverse sb.reverse().toString(); for (int i 0; i < s.length() - 2; i) { // 修改循环终止条件为 <&#xf…

matlab实现对全球不规则投影数据的投影转换

前几个专栏我们讨论了几个不规则的投影转换问题&#xff0c;有需要的可以阅读以下文章&#xff1a; matlab实现对极地投影数据的投影转换_matlab极地投影-CSDN博客 联合matlab和Arcgis进行netcdf格式的雪覆盖数据的重新投影栅格-CSDN博客 这次遇到的问题是一个墨卡托投影的数据…

【JavaWeb】Spring非阻塞通信 - Spring Reactive之WebFlux的使用

【JavaWeb】Spring非阻塞通信 - Spring Reactive之WebFlux的使用 文章目录 【JavaWeb】Spring非阻塞通信 - Spring Reactive之WebFlux的使用参考资料一、初识WebFlux1、什么是函数式编程1&#xff09;面向对象编程思维 VS 函数式编程思维&#xff08;封装、继承和多态描述事物间…

vue3新功能-Teleport

1.teleport 在组件内的任何位置渲染内容 将一个组件内部的一部分模板“传送”到该组件的 DOM 结构外层的位置去。 例:将组件dialog添加到body下面 <teleport to"body"> <el- dialog --> </teleport> 2.fragments 多个根元素外层不需要…

2024年了,还能学自动化吗?

大家都说2024年软件测试行业会卷的更厉害&#xff0c;简单的功能测试不再是入门的标准&#xff0c;那么2024年是否可以从自动化测试这块冲一把呢&#xff1f; 我们先来看看过去的一年自动化测试在测试行业中的发展分析&#xff1a; 01 市场需求增长 随着技术的进步和企业对软件…

爬虫入门系列-HTML基础语法

&#x1f308;个人主页&#xff1a;会编辑的果子君 &#x1f4ab;个人格言:“成为自己未来的主人~” HTML基础语法 bs4解析比较简单&#xff0c;但是呢&#xff0c;首先你需要了解一丢丢的html知识&#xff0c;然后再去使用bs4去提取&#xff0c;逻辑和编写难度就会非常简…

消息队列常见的两种消费模式

一、点对点模式 点对点模式&#xff1a;生产者发送消息到消息队列&#xff0c;消费者从消息队列中接收、处理消息&#xff0c;消息被消费后&#xff0c;就不在消息队列中了。每个消息只能由一个消费者接收和处理。如果有多个消费者监听同一个队列&#xff0c;消息将被发送到其…

刷题DAY29 | LeetCode 491-递增子序列 46-全排列 47-全排列 II

491 递增子序列&#xff08;medium&#xff09; 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素&#xff0c;如出现两个整数相等&#xff0c;也…

流畅的 Python 第二版(GPT 重译)(五)

第九章. 装饰器和闭包 有人对将这个功能命名为“装饰器”的选择提出了一些抱怨。主要的抱怨是该名称与其在 GoF 书中的用法不一致。 名称 decorator 可能更多地归因于其在编译器领域的用法—语法树被遍历并注释。 PEP 318—函数和方法的装饰器 函数装饰器让我们在源代码中“标记…

外包干了14天,技术退步明显。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;2019年我通过校招踏入了成都一家软件公司&#xff0c;开始了我的职业生涯。那时的我&#xff0c;满怀热血和憧憬&#xff0c;期待着在这个行业中闯出一片天地。然而&#xff0c;随着时间的推移&#xff0c;我发现自己逐渐陷入…

NVIDIA Chat with RTX教程使用以及CUDA和CUDNN

基本环境安装&#xff1a;CUDA12.1CUDNNcudnn-windows-x86_64-8.9.7.29_cuda12-archive 1、CUDA下载 CUDA官方安装教程: https://docs.nvidia.com/cuda/cuda-installation-guide-microsoft-windows/index.html CUDA Toolkit的下载: CUDA Toolkit 12.1 Downloads | NVIDIA Dev…

Vue.js+SpringBoot开发高校宿舍调配管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能需求2.1 学生端2.2 宿管2.3 老师端 三、系统展示四、核心代码4.1 查询单条个人习惯4.2 查询我的室友4.3 查询宿舍4.4 查询指定性别全部宿舍4.5 初次分配宿舍 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的…

如何读懂Java GC日志

Java应用程序的GC日志对分析定位很多性能问题有着非常大的帮助。默认情况下&#xff0c;Java应用程序不会自动产生GC日志。如果需要输出GC日志&#xff0c;必须在JVM启动时增加对应的参数&#xff0c;场景的参数如表5-8所示。 2. GC日志分析一 例如&#xff0c;在Tomcat的JVM启…

【Spring Cloud】微服务注册中心的工作原理

SueWakeup 个人主页&#xff1a;SueWakeup 系列专栏&#xff1a;学习技术栈 个性签名&#xff1a;人生乏味啊&#xff0c;我欲令之光怪陆离 本文封面由 凯楠&#x1f4f7; 友情提供&#xff01; 目录 前言 1. 注册中心的主要作用 2. 常见的注册中心 3. Nacos 服务注册和发…

护眼大路灯哪个更适合学生?大路灯购选分享,经验总结!

在当前开节奏的生活领域中&#xff0c;作为测评师我观察到&#xff0c;大路灯作为一种新型照明的补光工具&#xff0c;逐渐被越来越多的人融入家庭生活中。这种设备无疑为用眼人群带来了显著的好处。但许多用户反馈中也频繁提及平时是眼睛疲劳感越来越严重等副情况&#xff0c;…

Java 学习和实践笔记(42):内部类(inner class)

内部类的两个要点: 1&#xff09;内部类提供了更好的封装。只能让外部类直接访问&#xff0c;不允许同一个包中的其他类直 接访问。 2&#xff09;内部类可以直接访问外部类的私有属性&#xff0c;内部类被当成其外部类的成员。但外部类 不能访问内部类的内部属性。| 注意&…

【开源】SpringBoot框架开发个人保险管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 登录注册模块2.2 保险档案模块2.3 保险订单模块2.4 保险理赔模块 三、系统展示四、核心代码4.1 查询保险产品4.2 新增保险预定4.3 订单支付4.4 新增理赔单4.5 查询保险理赔 五、免责说明 一、摘要 1.1 项目介绍 基于J…

停车管理系统asp.net+sqlserver

停车管理系统asp.netsqlserver 说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于asp.net架构和sql server数据库&#xff0c; 功能模块&#xff1a; 停车管理系统asp.net sqlserver 用户功能有菜单列表 我的停车记录 专…