系统聚类比较——最短距离法、最长距离法、重心法和类平均法

系统聚类概述

系统聚类,又称分层聚类法,是一种用于分析数据的统计方法,在生物学、分类学、社会网络等领域有广泛应用。以下是对系统聚类的详细概述:

一、基本思想

系统聚类的基本思想是将每个样品(或数据点)视为单独的类,然后基于它们之间的相似性(或距离)进行逐步合并或分裂,以构建一个层次结构的聚类结果。这种层次结构可用于分析数据的不同层次的相似性关系。

二、聚类方式

系统聚类主要包括两种基本的聚类方式:

  1. 凝聚聚类:从单个样本开始,不断将最相似的两个样本合并,形成一个新的聚类。这个过程一直持续到所有样本都被合并到一个聚类中为止。凝聚聚类的优点是在处理大数据时,计算复杂度相对较低;但其缺点是可能会导致聚类数量不准确,对噪声和异常值的敏感度较高。
  2. 分裂聚类:从所有样本开始,不断将最不相似的两个样本分开,形成一个新的聚类。这个过程一直持续到所有样本都被分到不同的聚类中为止。分裂聚类的优点是聚类数量比较准确,对噪声和异常值的影响较小;但其缺点是在处理大数据时,计算复杂度较高。

三、距离与相似度度量

在系统聚类中,类与类之间的距离有多种定义方法,常见的包括:

  1. 最短距离法:类与类之间的距离等于两类最近样品之间的距离。
  2. 最长距离法:类与类之间的距离等于两类最远样品之间的距离。
  3. 类平均法:类与类之间的距离等于各类元素两两之间的平方距离的平均。
  4. 重心法:类与类之间的距离定义为对应这两类重心之间的距离。对样品分类来说,每一类的类重心就是该类样品的均值。
  5. 中间距离法:介于最短距离法和最长距离法之间的一种方法,既不考虑最近距离,也不考虑最远距离,而是采用介于最远和最近之间的距离。
  6. 离差平方和法(Ward法):基于方差分析的思想,如果分类正确,同类样品之间的离差平方和应当较小,类与类之间的离差平方和应当较大。

此外,常用的空间距离度量还包括绝对值距离、欧氏距离、切比雪夫距离、马氏距离和兰氏距离等。

四、聚类过程与结果

系统聚类的过程通常包括以下几个步骤:

  1. 定义以变量或指标的个数为维度的空间里的一种距离。
  2. 计算所有样本两两之间的距离。
  3. 将每个样本归为一类,根据计算出的样本间的距离合并距离最近的两类为一个新类。
  4. 再计算新类与其他各类的距离,并根据计算出的距离合并距离最近的两类为一个新类。
  5. 循环以上过程直至类别个数为1或达到其他停止条件。

最终,系统聚类会生成一个层次结构的聚类结果,可以通过聚类图(或称为树状图、谱系图)直观地展示。研究者可以根据聚类图决定将数据分为多少类,并深入分析数据的结构和组织。

五、应用与优势

系统聚类在多个领域都有广泛应用,如生物学中的物种分类、市场细分中的客户群划分、文本挖掘中的主题识别等。其优势在于能够构建层次结构的聚类结果,为研究者提供了对数据结构和组织的更深层次的认识。同时,通过选择不同的相似度或距离度量方式以及聚类算法,可以得到不同的聚类结果,以满足不同领域和问题的需求。

综上所述,系统聚类是一种灵活且强大的聚类分析方法,适用于多个领域的数据分析和挖掘任务。

系统聚类方法比较

本文使用Python对不同系统聚类的结果进行比较分析。

数据读取 

#不同系统聚类法的比较
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import AgglomerativeClustering
from scipy.cluster.hierarchy import dendrogram, linkage, ward
#创建数据
index=['A','B','C','D','E']
X1=[6901.6,8467.3,5067.7,5777.3,5975.7]
X2=[2321.3,1903.9,1746.6,1776.9,1963.5]
X3=[4632.8,7385.4,3753.4,3752.6,3809.4]
X4=[1558.2,1420.7,1430.2,1329.1,1322.1]
X5=[3447.0,5100.9,1993.8,2517.9,3064.3]
X6=[3018.5,3452.3,2078.8,2322.1,2352.9]
X7=[2313.6,1691.9,1524.5,1583.4,1750.4]
X8=[802.8,645.3,492.8,479.9,614.9]
X=np.array([X1,X2,X3,X4,X5,X6,X7,X8]).T

Python绘制谱系图 

#%%
#最短距离法
model=AgglomerativeClustering(n_clusters=3,linkage='single')
#linkage='single'表示最短距离法
model.fit(X)
# #输出欧式距离
# print(model.children_)
# #输出聚类结果
# print(model.labels_)
#绘制聚类结果
plt.figure(figsize=(10,5))
plt.subplot(421)
plt.title('Single linkage')
plt.scatter(X[:,0],X[:,1],c=model.labels_,cmap='rainbow')
for i in range(X.shape[0]):plt.text(X[i,0],X[i,1],index[i])#绘制谱系图
linkage_matrix=linkage(X,method='single',metric='euclidean')
plt.subplot(422)
#转换横坐标与纵坐标
dendrogram(linkage_matrix,labels=index,orientation='right')
plt.show()#最长距离法
model=AgglomerativeClustering(n_clusters=3,linkage='complete')
#linkage='complete'表示最长距离法
model.fit(X)
# #输出欧式距离
# print(model.children_)
# #输出聚类结果
# print(model.labels_)
#绘制聚类结果
plt.figure(figsize=(10,5))
plt.subplot(423)
plt.title('Complete linkage')
plt.scatter(X[:,0],X[:,1],c=model.labels_,cmap='rainbow')
for i in range(X.shape[0]):plt.text(X[i,0],X[i,1],index[i])#绘制谱系图
linkage_matrix=linkage(X,method='complete',metric='euclidean')
plt.subplot(424)
#转换横坐标与纵坐标
dendrogram(linkage_matrix,labels=index,orientation='right')
plt.show()#重心法
model=AgglomerativeClustering(n_clusters=3,linkage='average')
#linkage='average'表示重心法
model.fit(X)
#输出欧式距离
# print(model.children_)
#输出聚类结果
# print(model.labels_)
#绘制聚类结果
plt.figure(figsize=(10,5))
plt.subplot(425)
plt.title('Average linkage')
plt.scatter(X[:,0],X[:,1],c=model.labels_,cmap='rainbow')
for i in range(X.shape[0]):plt.text(X[i,0],X[i,1],index[i])#绘制谱系图
linkage_matrix=linkage(X,method='average',metric='euclidean')
plt.subplot(426)
#转换横坐标与纵坐标
dendrogram(linkage_matrix,labels=index,orientation='right')
plt.show()#类平均法
model=AgglomerativeClustering(n_clusters=3,linkage='ward')
#linkage='ward'表示类平均法
model.fit(X)
#输出欧式距离
# print(model.children_)
#输出聚类结果
# print(model.labels_)
#绘制聚类结果
plt.figure(figsize=(10,5))
plt.subplot(427)
plt.title('Ward linkage')
plt.scatter(X[:,0],X[:,1],c=model.labels_,cmap='rainbow')
for i in range(X.shape[0]):plt.text(X[i,0],X[i,1],index[i])#绘制谱系图欧氏距离衡量
linkage_matrix=linkage(X,method='ward',metric='euclidean')
plt.subplot(428)
#转换横坐标与纵坐标
dendrogram(linkage_matrix,labels=index,orientation='right')
plt.show()

 一、最短距离法

二、最长距离法

 三、重心法

四、类平均法

Python绘制聚类图 

#最短距离法
model=AgglomerativeClustering(n_clusters=3,linkage='single')#linkage='single'表示最短距离法
model.fit(X)plt.figure(figsize=(10,5))
plt.subplot(221)
plt.title('Single linkage')
plt.scatter(X[:,0],X[:,1],c=model.labels_,cmap='rainbow')
for i in range(X.shape[0]):plt.text(X[i,0],X[i,1],index[i])#最长距离法
model=AgglomerativeClustering(n_clusters=3,linkage='complete')#linkage='complete'表示最长距离法
model.fit(X)plt.subplot(222)
plt.title('Complete linkage')
plt.scatter(X[:,0],X[:,1],c=model.labels_,cmap='rainbow')
for i in range(X.shape[0]):plt.text(X[i,0],X[i,1],index[i])
plt.show()
#重心法
model=AgglomerativeClustering(n_clusters=3,linkage='average')#linkage='average'表示重心法
model.fit(X)plt.figure(figsize=(10,5))
plt.subplot(223)
plt.title('Average linkage')
plt.scatter(X[:,0],X[:,1],c=model.labels_,cmap='rainbow')
for i in range(X.shape[0]):plt.text(X[i,0],X[i,1],index[i])#类平均法
model=AgglomerativeClustering(n_clusters=3,linkage='ward')#linkage='ward'表示类平均法
model.fit(X)plt.subplot(224)
plt.title('Ward linkage')
plt.scatter(X[:,0],X[:,1],c=model.labels_,cmap='rainbow')
for i in range(X.shape[0]):plt.text(X[i,0],X[i,1],index[i])
plt.show()

一、最短距离法(左)和最长距离法(右)

二、重心法(左)和类平均法(右)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OAK相机的RGB-D彩色相机去畸变做对齐

▌低畸变标准镜头的OAK相机RGB-D对齐的方法 OAK相机内置的RGB-D管道会自动将深度图和RGB图对齐。其思想是将深度图像中的每个像素与彩色图像中对应的相应像素对齐。产生的RGB-D图像可以用于OAK内置的图像识别模型将识别到的2D物体自动映射到三维空间中去,或者产生的…

深入理解Python异常处理机制

在Python编程中,异常处理是一个非常重要的概念。它可以帮助我们捕获程序运行过程中出现的错误,防止程序崩溃,并提供友好的错误信息。本文将详细讲解Python的异常处理机制,并提供丰富的代码示例,帮助您更好地理解和应用…

【Spring MVC】响应结果和设置

​ 我的主页:2的n次方_ 1. 返回静态页面 先创建一个 html 页面 ​ 如果还按照之前的方式进行返回的话,返回的并不是一个 html 页面 RequestMapping("/response") RestController public class ResponseController {RequestMapping(&quo…

React基础使用教程

初识JSX React主要使用的就是jsx语法来编写dom,所以我们要先认识jsx,然后再开始学习两者相结合jsx其实就是在JS中编写HTML的一种写法编写jsx要注意以下几个规则: 定义虚拟DOM时,不要写引号标签中混入JS表达式时要用{}样式的类名指…

2024 Rust现代实用教程:1.3获取rust的库国内源以及windows下的操作

文章目录 一、使用Cargo第三方库1.直接修改Cargo.toml2.使用cargo-edit插件3.设置国内源4.与windows下面的rust不同点 参考 一、使用Cargo第三方库 1.直接修改Cargo.toml rust语言的库:crate 黏贴至Cargo.toml 保存完毕之后,自动下载依赖 拷贝crat…

形态学-闭运算

目录 依赖库显示图像的函数读取图像转换为灰度图像应用二值化阈值处理创建结构元素应用形态学闭运算显示结果 依赖库 首先,我们需要导入必要的库: import cv2 import numpy as npcv2 是OpenCV的Python接口,用于图像处理。numpy 是一个用于科…

在时间敏感网络中启用网络诊断:协议、算法和硬件

英文论文标题:Enabling Network Diagnostics in Time-Sensitive Networking: Protocol, Algorithm, and Hardware 作者信息: Zeyu Wang, Xiaowu He, Xiangwen Zhuge, Shen Xu, Fan Dang, Jingao Xu, Zheng Yang所属机构:清华大学软件学院和…

Pytorch笔记--RuntimeError: NCCL communicator was aborted on rank 3.

1--分布式并行训练,出现以下bug: [E ProcessGroupNCCL.cpp:719] [Rank 3] Watchdog caught collective operation timeout: WorkNCCL(SeqNum1721483, OpTypeALLREDUCE, Timeout(ms)1800000) ran for 1805695 milliseconds before timing out. RuntimeErr…

Docker:安装 Syslog-ng 的技术指南

1、简述 Syslog-ng 是一种流行的日志管理工具,能够集中处理和分析日志。通过 Docker 安装 Syslog-ng 可以简化部署和管理过程。本文将介绍如何使用 Docker 安装 Syslog-ng,并提供一个 Java 示例来展示如何将日志发送到 Syslog-ng。 2、安装 2.1 创建…

[mysql]子查询的概述和分类及单行子查询

子查询引入 查询的基本结构已经给大家了,子查询里面也是有一些新的内容,子查询其实就是在查询中嵌套另一个查询,叫嵌套查询可能大家更容易理解一点..,类似与FOR循环和FOR循环的嵌套,这一章是我们查询的最难的部分,大家 难度是查询的顶峰,多表查询和子查询是非常重要,SQL优化里…

【CUDA代码实践02】矩阵加法运算程序

文章目录 main.cu代码工作流程 matrixSum.cuhmatrixSum.cu代码结构说明总体工作流程 近年来,人工智能(AI)技术,尤其是大模型的快速发展,打开了全新的时代大门。对于想要在这个时代迅速成长并提升自身能力的个人而言&am…

k8s可以部署私有云吗?私有云部署全攻略

k8s可以部署私有云吗?K8S可以部署私有云。Kubernetes是一个开源的容器编排引擎,能够自动化容器的部署、扩展和管理,使得应用可以在各种环境中高效运行。通过使用Kubernetes,企业可以在自己的数据中心或私有云环境中搭建和管理容器…

OpenSSH_8.7 无法使用密码登录问题解决

文章目录 前言SSH 版本 配置 SSH 密码登录其它总结个人简介 前言 最近使用 Crunchbits VPS(virt.crunchbits.com) 时,由于更换电脑导致认证的 ssh 秘钥丢失,尝试 SSH 密码登录时遇到如下错误提示:Permission denied (…

探索 Python 幽默之源:pyjokes 库全解析

🚀 探索 Python 幽默之源:pyjokes 库全解析 1. 背景介绍:为何选择 pyjokes? 在紧张的编程工作中,幽默是一种有效的缓解压力的方式。pyjokes 是一个专为程序员设计的 Python 库,它提供了丰富的单行笑话&am…

【Dv2Admin】Django配置线上ws反向代理

在 Web 应用程序的部署过程中,安全性、稳定性和实时通信是开发者们普遍关注的重点。Django 是一个非常流行的 Web 框架,常与 Nginx 配合使用,以便实现反向代理、负载均衡以及 SSL 加密等功能。除此之外,实时功能(如 WebSocket)也是现代应用中经常使用的技术。 在项目中实…

Fast Simulation of Mass-Spring Systems in Rust 论文阅读

参考资料: Fast Simulation of Mass-Spring Systems in Rust 论文阅读:Fast Simulation of Mass-Spring Systems 【论文精读】讲解刘天添2013年的fast simulation of mass spring system(Projective Dynamics最早的论文) Projective Dynamics笔记(一…

uniapp圆形波浪进度效果

uniapp圆形波浪进度效果 背景实现思路代码实现尾巴 背景 最近项目中有些统计的地方需要用到圆形的波浪进度效果,要求是根据百分比值然后在一个圆形内动态的展示一个波浪形的进度,看参考一下效果。 实现思路 这个效果看着挺复杂的,那么我们…

【Linux】磁盘文件系统(inode)、软硬链接

文章目录 1. 认识磁盘1.1 磁盘的物理结构1.2 磁盘的逻辑结构 2. 引入文件系统2.1 EXT系列文件系统的分区结构2.2 inode 3. 软硬链接3.1 软链接3.2 硬链接 在讲过了内存文件系统后,我们可以知道文件分为两种: 打开的文件(内存中)未…

如何提高英语口语表达能力?

提高英语口语表达能力是一个逐步积累和实践的过程。 1. 自我练习方法 录音与回听 录音:用手机或其他设备录下自己的口语练习,比如描述一天的活动、讲述一个故事或复述一篇文章。 回听:仔细听录音,找出发音、语法和流利度方面的问…

【设计模式-状态模式】

状态模式(State Pattern)是一种行为设计模式,它允许一个对象在内部状态改变时改变它的行为。换句话说,这种模式让对象在不同的状态下能够表现出不同的行为,而不需要修改对象的代码。状态模式通过将对象的行为与状态进行…